7-bo‘lim
Funksiyalar
fun e'loni, bir ifodali funksiyalar, standart va nomlangan argumentlar, vararg, Unit, ichki funksiyalar va rekursiya.
Ushbu bo‘lim mundarijasi
Funksiya - nomlangan kod bo'lagi. Kotlin da u fun so'zi bilan
e'lon qilinadi va bir nechta qulay shakli bor.
Oddiy funksiya #
fun salomlash(ism: String) {
println("Assalomu alaykum, $ism!")
}
fun yigindi(a: Int, b: Int): Int {
return a + b
}
fun main() {
salomlash("Malika")
println(yigindi(15, 27))
}
Assalomu alaykum, Malika!
42
Shakli: fun nom(parametr: Tur): QaytariladiganTur.
Diqqat: parametrda avval nom, keyin tur yoziladi - ko'p tillarda teskari.
Bir ifodali funksiya #
fun yigindi(a: Int, b: Int): Int = a + b
fun kvadrat(x: Int) = x * x
fun kattasi(a: Int, b: Int) = if (a > b) a else b
fun salom(ism: String) = "Salom, $ism!"
fun main() {
println(yigindi(15, 27))
println(kvadrat(9))
println(kattasi(7, 12))
println(salom("Nodira"))
}
42
81
12
Salom, Nodira!
Tanasi bitta ifodadan iborat bo'lsa, { return ... } o'rniga =
yoziladi. Qaytariladigan turni ham kompilyator o'zi topadi.
Ichki yoki kichik funksiyalarda turni tushirib qoldirish odatiy.
Lekin ommaviy funksiyada uni yozgan ma'qul: kodni o'qiyotgan odam funksiya nima qaytarishini tanasiga qaramasdan bilishi kerak.
Ba'zi jamoalar buni qoida qilib qo'yadi.
Unit - hech narsa qaytarmaslik #
fun chiqar(matn: String): Unit {
println(matn)
}
fun chiqar2(matn: String) {
println(matn)
}
fun main() {
chiqar("birinchi")
chiqar2("ikkinchi")
val natija = chiqar("uchinchi")
println(natija)
}
birinchi
ikkinchi
uchinchi
kotlin.Unit
Unit - "qiymat yo'q" degani (boshqa tillardagi void). Uni yozish
shart emas; kompilyator o'zi qo'yadi.
Qizig'i shundaki, Unit ham haqiqiy qiymat - shuning uchun
uchinchi natija kotlin.Unit bo'lib chiqdi.
Standart argumentlar #
fun salomlash(ism: String, unvon: String = "hurmatli") =
"Assalomu alaykum, $unvon $ism!"
fun chiziq(uzunlik: Int = 20, belgi: Char = '-') =
belgi.toString().repeat(uzunlik)
fun main() {
println(salomlash("Nodira"))
println(salomlash("Karimov", "ustoz"))
println(chiziq())
println(chiziq(10))
println(chiziq(10, '='))
}
Assalomu alaykum, hurmatli Nodira!
Assalomu alaykum, ustoz Karimov!
--------------------
----------
==========
Standart qiymat bo'lsa, argumentni tushirib qoldirish mumkin.
Java da bir nechta variant yozish odat: chiziq(), chiziq(int),
chiziq(int, char) - uchta alohida funksiya.
Kotlin da standart argumentlar bu uchalasini bitta funksiyaga jamlaydi. Shuning uchun ortiqcha yuklash (overloading) ancha kam ishlatiladi.
Nomlangan argumentlar #
fun hisobot(
nom: String,
yil: Int = 2026,
oy: Int = 1,
toliq: Boolean = false
) = "$nom: $yil-yil $oy-oy (to'liq: $toliq)"
fun main() {
println(hisobot("Savdo"))
println(hisobot("Savdo", oy = 9))
println(hisobot("Savdo", toliq = true))
println(hisobot(nom = "Savdo", oy = 12, yil = 2025))
}
Savdo: 2026-yil 1-oy (to'liq: false)
Savdo: 2026-yil 9-oy (to'liq: false)
Savdo: 2026-yil 1-oy (to'liq: true)
Savdo: 2025-yil 12-oy (to'liq: false)
oy = 9 - o'rtadagilarni o'tkazib yuborishning yagona yo'li.
Nomlangan argumentlar tartibini ham o'zgartirish mumkin.
Quyidagi chaqiruvni ko'ring:
hisobot("Savdo", 2026, 1, true)
Bu true nima degani? Kodni o'qiyotgan odam funksiya e'loniga
qarashi kerak.
hisobot("Savdo", toliq = true)
Endi hech qanday savol qolmaydi. Boolean argumentlarni doim
nom bilan uzating.
Noma'lum sondagi argument #
fun jami(vararg sonlar: Int): Int {
var natija = 0
for (son in sonlar) natija += son
return natija
}
fun royxat(sarlavha: String, vararg elementlar: String) =
"$sarlavha: ${elementlar.joinToString(", ")}"
fun main() {
println(jami(1, 2, 3))
println(jami(10, 20, 30, 40, 50))
println(jami())
println(royxat("Shaharlar", "Namangan", "Andijon"))
val massiv = intArrayOf(5, 10, 15)
println(jami(*massiv))
}
6
150
0
Shaharlar: Namangan, Andijon
30
*massiv - yoyish operatori: mavjud massivni alohida
argumentlarga yoyadi.
Ichki funksiyalar #
fun hisobot(ballar: List<Int>): String {
fun ortacha() = ballar.sum().toDouble() / ballar.size
fun baho(x: Double) = if (x >= 85) "a'lo" else "yaxshi"
val o = ortacha()
return "O'rtacha: $o, baho: ${baho(o)}"
}
fun main() {
println(hisobot(listOf(85, 92, 95)))
println(hisobot(listOf(70, 75, 80)))
}
O'rtacha: 90.66666666666667, baho: a'lo
O'rtacha: 75.0, baho: yaxshi
Funksiya ichida funksiya e'lon qilish mumkin. U tashqi funksiyaning
parametrlarini ko'radi (ballar ni qayta uzatish kerak emas) va
tashqaridan ko'rinmaydi.
Rekursiya #
fun faktorial(n: Int): Long =
if (n <= 1) 1 else n * faktorial(n - 1)
tailrec fun yigindi(n: Int, jami: Long = 0): Long =
if (n == 0) jami else yigindi(n - 1, jami + n)
fun main() {
println((1..8).joinToString(" ") { "${faktorial(it)}" })
println(yigindi(100000))
}
1 2 6 24 120 720 5040 40320
5000050000
Ikkinchi funksiyada tailrec so'zi bor. U bo'lmasa,
yigindi(100000) chaqiruvi StackOverflowError bilan tugardi -
100 ming chaqiruv stekka sig'maydi.
tailrec kompilyatorga: "bu rekursiyani siklga aylantir" deydi.
Shart bitta - rekursiv chaqiruv funksiyaning eng oxirgi amali
bo'lishi kerak.
faktorial da bu shart bajarilmaydi (chaqiruvdan keyin ko'paytirish
bor), shuning uchun unga tailrec qo'yib bo'lmaydi.
Bir nechta qiymat qaytarish #
fun bolibChiq(jami: Int, bolovchi: Int): Pair<Int, Int> =
Pair(jami / bolovchi, jami % bolovchi)
fun main() {
val (butun, qoldiq) = bolibChiq(47, 6)
println("$butun ta to'la, $qoldiq ta ortdi")
val juft = bolibChiq(20, 7)
println(juft.first)
println(juft.second)
println(juft)
}
7 ta to'la, 5 ta ortdi
2
6
(2, 6)
Pair - ikkita qiymat uchun. Uchta kerak bo'lsa Triple bor.
Ko'proq bo'lsa - data class yozing (12-bo'lim).
val (a, b) = ... - yoyish, xuddi withIndex() dagidek.
Funksiya nomlarida orqa tirnoq #
fun `ikki sonni qo'shadi`(a: Int, b: Int) = a + b
fun main() {
println(`ikki sonni qo'shadi`(2, 3))
}
5
Orqa tirnoq ichida bo'shliqli nom ham yozish mumkin. Odatda bu faqat testlarda ishlatiladi - u yerda test nomi gap bo'lgani o'qishni osonlashtiradi.
- Ikkita sonning o'rtachasini qaytaradigan funksiya yozing.
- Uni bir ifodali shaklga o'tkazing.
- Uchburchak yuzasini hisoblaydigan funksiya yarating.
- Standart argumentli salomlashish funksiyasini yozing.
Booleanargumentni nom bilan uzating.varargbilan o'rtacha hisoblaydigan funksiya yozing.- Mavjud massivni
*bilan yoyib uzating. - Ichki funksiya yozib, tashqi parametrdan foydalaning.
- Fibonachchi sonini rekursiya bilan hisoblang.
Pairqaytaradigan funksiya yozib, natijani yoying.
Xulosa #
fun nom(parametr: Tur): Tur- parametrda avval nom, keyin tur.- Bitta ifodali funksiya
=bilan yoziladi va turni kompilyator topadi. Unit- qiymat qaytarmaslik; yozish shart emas.- Standart argumentlar ortiqcha yuklashning o'rnini bosadi.
- Nomlangan argumentlar o'rtadagilarni o'tkazib yuborishga va kodni o'qishli qilishga imkon beradi.
vararg- noma'lum sondagi argument; mavjud massivni*bilan yoyiladi.- Ichki funksiya tashqi parametrlarni ko'radi va tashqaridan yashirin qoladi.
tailrecchuqur rekursiyani siklga aylantiradi.PairvaTriplebir nechta qiymat qaytaradi;val (a, b) = ...ularni yoyadi.
Keyingi bo'limda Kotlin ning eng muhim xususiyatini - null xavfsizligini o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.