7-bo‘lim

Funksiyalar

fun e'loni, bir ifodali funksiyalar, standart va nomlangan argumentlar, vararg, Unit, ichki funksiyalar va rekursiya.

🕑 13 daqiqa o‘qish 📄 560 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Oddiy funksiya
  2. Bir ifodali funksiya
  3. Unit - hech narsa qaytarmaslik
  4. Standart argumentlar
  5. Nomlangan argumentlar
  6. Noma'lum sondagi argument
  7. Ichki funksiyalar
  8. Rekursiya
  9. Bir nechta qiymat qaytarish
  10. Funksiya nomlarida orqa tirnoq
  11. Xulosa

Funksiya - nomlangan kod bo'lagi. Kotlin da u fun so'zi bilan e'lon qilinadi va bir nechta qulay shakli bor.

Oddiy funksiya #

KOTLIN
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))
}
Natija
Assalomu alaykum, Malika!
42

Shakli: fun nom(parametr: Tur): QaytariladiganTur.

Diqqat: parametrda avval nom, keyin tur yoziladi - ko'p tillarda teskari.

Bir ifodali funksiya #

KOTLIN
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"))
}
Natija
42
81
12
Salom, Nodira!

Tanasi bitta ifodadan iborat bo'lsa, { return ... } o'rniga = yoziladi. Qaytariladigan turni ham kompilyator o'zi topadi.

Qachon turni yozish kerak

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 #

KOTLIN
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)
}
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 #

KOTLIN
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, '='))
}
Natija
Assalomu alaykum, hurmatli Nodira!
Assalomu alaykum, ustoz Karimov!
--------------------
----------
==========

Standart qiymat bo'lsa, argumentni tushirib qoldirish mumkin.

Kotlin da funksiyani ortiqcha yuklash kam kerak

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 #

KOTLIN
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))
}
Natija
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.

Mantiqiy argumentni nom bilan uzating

Quyidagi chaqiruvni ko'ring:

KOTLIN
hisobot("Savdo", 2026, 1, true)

Bu true nima degani? Kodni o'qiyotgan odam funksiya e'loniga qarashi kerak.

KOTLIN
hisobot("Savdo", toliq = true)

Endi hech qanday savol qolmaydi. Boolean argumentlarni doim nom bilan uzating.

Noma'lum sondagi argument #

KOTLIN
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))
}
Natija
6
150
0
Shaharlar: Namangan, Andijon
30

*massiv - yoyish operatori: mavjud massivni alohida argumentlarga yoyadi.

Ichki funksiyalar #

KOTLIN
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)))
}
Natija
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 #

KOTLIN
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))
}
Natija
1 2 6 24 120 720 5040 40320
5000050000
tailrec - chuqur rekursiya uchun

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 #

KOTLIN
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)
}
Natija
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 #

KOTLIN
fun `ikki sonni qo'shadi`(a: Int, b: Int) = a + b

fun main() {
    println(`ikki sonni qo'shadi`(2, 3))
}
Natija
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.

Amaliy topshiriq
  1. Ikkita sonning o'rtachasini qaytaradigan funksiya yozing.
  2. Uni bir ifodali shaklga o'tkazing.
  3. Uchburchak yuzasini hisoblaydigan funksiya yarating.
  4. Standart argumentli salomlashish funksiyasini yozing.
  5. Boolean argumentni nom bilan uzating.
  6. vararg bilan o'rtacha hisoblaydigan funksiya yozing.
  7. Mavjud massivni * bilan yoyib uzating.
  8. Ichki funksiya yozib, tashqi parametrdan foydalaning.
  9. Fibonachchi sonini rekursiya bilan hisoblang.
  10. Pair qaytaradigan 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.
  • tailrec chuqur rekursiyani siklga aylantiradi.
  • Pair va Triple bir nechta qiymat qaytaradi; val (a, b) = ... ularni yoyadi.

Keyingi bo'limda Kotlin ning eng muhim xususiyatini - null xavfsizligini o'rganamiz.

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.