11-bo‘lim

Funksiyalar

Kodni qayta ishlatish: funksiya yaratish, parametrlar, standart qiymatlar, *args va **kwargs, ko'rinish sohasi, lambda va rekursiya.

🕑 18 daqiqa o‘qish 📄 466 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Funksiya yaratish
  2. Parametrlar va argumentlar
  3. Bir nechta parametr
  4. Standart qiymatlar
  5. return - qiymat qaytarish
  6. Bir nechta qiymat qaytarish
  7. *args - noma'lum sonli argumentlar
  8. **kwargs - noma'lum sonli nomli argumentlar
  9. Hammasini birga ishlatish
  10. Ko'rinish sohasi (scope)
  11. Turlarni ko'rsatish (type hints)
  12. lambda - anonim funksiya
  13. Rekursiya
  14. Amaliy misol: talaba baholari moduli
  15. Xulosa

Bir xil kodni ikki marta yozgan bo'lsangiz - uni funksiyaga chiqarish vaqti keldi. Funksiya - bu nom berilgan, kerak bo'lganda chaqiriladigan kod bo'lagi.

Funksiya yaratish #

Python
def salomlashish():
    """Ekranga salomlashish xabarini chiqaradi."""
    print("Salom!")
    print("Xush kelibsiz.")


salomlashish()       # chaqirish
salomlashish()       # yana chaqirish
Natija
Salom!
Xush kelibsiz.
Salom!
Xush kelibsiz.

Tuzilishi:

QismMisolIzoh
def kalit so'zidefFunksiya e'lon qilinadi
Nomisalomlashishsnake_case uslubida
Qavslar()Parametrlar shu yerda
Ikki nuqta:Majburiy
Docstring"""..."""Funksiya nima qilishini tushuntiradi
Tanachekingan kodFunksiya mantiqi

Parametrlar va argumentlar #

Python
def salomlashish(ism):
    print(f"Salom, {ism}!")


salomlashish("Husanboy")
salomlashish("Sardor")
Natija
Salom, Husanboy!
Salom, Sardor!
Parametr va argument
  • Parametr - funksiya ta'rifidagi o'zgaruvchi (ism).
  • Argument - chaqirishda uzatiladigan haqiqiy qiymat ("Husanboy").

Bir nechta parametr #

Python
def talaba_malumoti(ism, yosh, shahar):
    print(f"{ism}, {yosh} yosh, {shahar} shahridan")


# Pozitsiya bo'yicha
talaba_malumoti("Husanboy", 25, "Namangan")

# Nom bo'yicha (tartib muhim emas)
talaba_malumoti(shahar="Toshkent", ism="Sardor", yosh=25)
Natija
Husanboy, 25 yosh, Namangan shahridan
Sardor, 25 yosh, Toshkent shahridan

Standart qiymatlar #

Python
def salomlashish(ism, salom="Salom"):
    print(f"{salom}, {ism}!")


salomlashish("Husanboy")
salomlashish("Sardor", "Assalomu alaykum")
Natija
Salom, Husanboy!
Assalomu alaykum, Sardor!
O'zgaruvchan standart qiymat - klassik tuzoq
Python
def royxatga_qosh(element, royxat=[]):      # XATO!
    royxat.append(element)
    return royxat

print(royxatga_qosh("a"))
print(royxatga_qosh("b"))
Natija
['a']
['a', 'b']      <- kutilmagan natija!

Sabab: standart qiymat funksiya e'lon qilinganda bir marta yaratiladi. To'g'ri yechim:

Python
def royxatga_qosh(element, royxat=None):
    if royxat is None:
        royxat = []
    royxat.append(element)
    return royxat

return - qiymat qaytarish #

Python
def yigindi(birinchi, ikkinchi):
    return birinchi + ikkinchi


natija = yigindi(15, 27)
print(natija)
print(yigindi(100, 200) * 2)
Natija
42
600

return funksiyani darhol tugatadi:

Python
def bolish(bolinuvchi, boluvchi):
    if boluvchi == 0:
        return "Nolga bo'lib bo'lmaydi"
    return bolinuvchi / boluvchi


print(bolish(10, 2))
print(bolish(10, 0))
Natija
5.0
Nolga bo'lib bo'lmaydi

Bir nechta qiymat qaytarish #

Python
def statistika(sonlar):
    """Ro'yxat bo'yicha eng kichik, eng katta va o'rtacha qiymatni qaytaradi."""
    return min(sonlar), max(sonlar), sum(sonlar) / len(sonlar)


baholar = [85, 92, 78, 95, 88]
eng_past, eng_yuqori, ortacha = statistika(baholar)

print(f"Eng past:   {eng_past}")
print(f"Eng yuqori: {eng_yuqori}")
print(f"O'rtacha:   {ortacha:.1f}")
Natija
Eng past:   78
Eng yuqori: 95
O'rtacha:   87.6
Aslida bu kortej

Vergul bilan ajratilgan qiymatlar avtomatik kortejga aylanadi. natija = statistika(baholar) desangiz, natija kortej bo'ladi.

*args - noma'lum sonli argumentlar #

Python
def jami(*sonlar):
    """Istalgan miqdordagi sonlar yig'indisini qaytaradi."""
    natija = 0
    for son in sonlar:
        natija += son
    return natija


print(jami(1, 2))
print(jami(1, 2, 3, 4, 5))
print(jami())
Natija
3
15
0

**kwargs - noma'lum sonli nomli argumentlar #

Python
def profil_yarat(**malumotlar):
    print("Foydalanuvchi profili:")
    for kalit, qiymat in malumotlar.items():
        print(f"  {kalit:<12}: {qiymat}")


profil_yarat(ism="Husanboy", yosh=25, shahar="Namangan", kasb="dasturchi")
Natija
Foydalanuvchi profili:
  ism         : Husanboy
  yosh        : 25
  shahar      : Namangan
  kasb        : dasturchi

Hammasini birga ishlatish #

Python
def hisobot(sarlavha, *qatorlar, **sozlamalar):
    kenglik = sozlamalar.get("kenglik", 30)
    belgi = sozlamalar.get("belgi", "=")

    print(belgi * kenglik)
    print(sarlavha.center(kenglik))
    print(belgi * kenglik)
    for qator in qatorlar:
        print(f"  - {qator}")


hisobot("KUNLIK HISOBOT",
        "10 ta buyurtma qabul qilindi",
        "3 ta yetkazildi",
        kenglik=36, belgi="*")
Natija
************************************
           KUNLIK HISOBOT           
************************************
  - 10 ta buyurtma qabul qilindi
  - 3 ta yetkazildi

Parametrlar tartibi qat'iy: def f(oddiy, standart=1, *args, **kwargs).

Ko'rinish sohasi (scope) #

Global soha (butun fayl) soliq_foizi = 12 Lokal soha (funksiya ichi) def hisobla(summa): natija = summa * soliq_foizi / 100 natija faqat shu yerda ko'rinadi → global soha uni ko'rmaydi
Funksiya ichidagi o'zgaruvchi tashqarida mavjud emas
Python
soliq_foizi = 12                # global o'zgaruvchi


def soliqni_hisobla(summa):
    natija = summa * soliq_foizi / 100      # globalni o'qish mumkin
    return natija


print(soliqni_hisobla(1_000_000))
# print(natija)     # NameError: 'natija' is not defined
Natija
120000.0

Global o'zgaruvchini funksiya ichida o'zgartirish uchun global kalit so'zi kerak:

Python
hisoblagich = 0


def ortdir():
    global hisoblagich
    hisoblagich += 1


ortdir()
ortdir()
ortdir()
print(hisoblagich)
Natija
3
global dan iloji boricha qoching

Global o'zgaruvchini o'zgartirish kodni kuzatishni qiyinlashtiradi. Yaxshiroq yechim - qiymatni return bilan qaytarish:

Python
def ortdir(joriy):
    return joriy + 1

hisoblagich = ortdir(hisoblagich)

Turlarni ko'rsatish (type hints) #

Python turlarni majburlamaydi, lekin ularni hujjat sifatida yozish mumkin:

Python
def ortacha_baho(baholar: list[int]) -> float:
    """Baholar ro'yxatining o'rtacha qiymatini qaytaradi."""
    return sum(baholar) / len(baholar)


def toliq_ism(ism: str, familiya: str, bosh_harf: bool = True) -> str:
    natija = f"{ism} {familiya}"
    return natija.title() if bosh_harf else natija


print(ortacha_baho([85, 92, 78]))
print(toliq_ism("husanboy", "karimova"))
Natija
85.0
Husanboy Qodirov
Nima uchun bu foydali?

Turlar ko'rsatilgan bo'lsa, muharrir sizga aniqroq maslahat beradi va boshqa dasturchi funksiyani ishlatishdan oldin nima kutilayotganini darrov tushunadi. Katta loyihalarda bu majburiy amaliyotga aylangan.

lambda - anonim funksiya #

Bir satrlik kichik funksiyalar uchun:

Python
# Oddiy funksiya
def kvadrat(son):
    return son ** 2

# Lambda ko'rinishi
kvadrat = lambda son: son ** 2
print(kvadrat(5))

# Asosiy foydasi - boshqa funksiyaga uzatish
talabalar = [("Husanboy", 85), ("Sardor", 92), ("Malika", 78)]

# Baho bo'yicha saralash
saralangan = sorted(talabalar, key=lambda juftlik: juftlik[1], reverse=True)
print(saralangan)

# Filtrlash
alochilar = list(filter(lambda t: t[1] >= 85, talabalar))
print(alochilar)

# O'zgartirish
oshirilgan = list(map(lambda t: (t[0], t[1] + 5), talabalar))
print(oshirilgan)
Natija
25
[('Sardor', 92), ('Husanboy', 85), ('Malika', 78)]
[('Husanboy', 85), ('Sardor', 92)]
[('Husanboy', 90), ('Sardor', 97), ('Malika', 83)]

Rekursiya #

Funksiya o'zini o'zi chaqirishi mumkin:

Python
def faktorial(son):
    """n! ni rekursiv usulda hisoblaydi."""
    if son <= 1:          # bazaviy holat - rekursiyani to'xtatadi
        return 1
    return son * faktorial(son - 1)


print(faktorial(5))       # 5 * 4 * 3 * 2 * 1
print(faktorial(10))
Natija
120
3628800
Bazaviy holatni unutmang

Rekursiyani to'xtatadigan shart bo'lmasa, Python RecursionError beradi. Python'da rekursiya chuqurligi sukut bo'yicha 1000 ta chaqiruv bilan cheklangan.

Amaliy misol: talaba baholari moduli #

Python
# ============================================
# Baholarni boshqarish funksiyalari
# ============================================

def ortacha_hisobla(baholar: list[int]) -> float:
    """Baholar ro'yxatining o'rtachasini qaytaradi."""
    if not baholar:
        return 0.0
    return sum(baholar) / len(baholar)


def harfli_baho(ball: float) -> str:
    """Ballni harfli bahoga aylantiradi."""
    if ball >= 90:
        return "A"
    if ball >= 80:
        return "B"
    if ball >= 70:
        return "C"
    if ball >= 60:
        return "D"
    return "F"


def hisobot_chiqar(guruh: dict) -> None:
    """Guruh bo'yicha to'liq hisobotni chiqaradi."""
    print("=" * 52)
    print(f"{'GURUH HISOBOTI':^52}")
    print("=" * 52)
    print(f"{'Talaba':<25}{'O‘rtacha':>12}{'Baho':>8}{'Holat':>10}")
    print("-" * 52)

    barcha_ortachalar = []

    for ism, baholar in guruh.items():
        ortacha = ortacha_hisobla(baholar)
        harf = harfli_baho(ortacha)
        holat = "o'tdi" if ortacha >= 60 else "o'tmadi"
        barcha_ortachalar.append(ortacha)
        print(f"{ism:<25}{ortacha:>12.1f}{harf:>8}{holat:>10}")

    print("-" * 52)
    print(f"{'Guruh o‘rtachasi:':<25}{ortacha_hisobla(barcha_ortachalar):>12.1f}")
    print("=" * 52)


guruh = {
    "Husanboy Qodirov": [85, 92, 78],
    "Sardor Aliyev":    [70, 65, 80],
    "Malika Yusupova":  [95, 91, 98],
    "Bekzod Rasulov":   [55, 48, 62],
}

hisobot_chiqar(guruh)
Natija
====================================================
                   GURUH HISOBOTI                   
====================================================
Talaba                    O'rtacha    Baho     Holat
----------------------------------------------------
Husanboy Qodirov              85.0       B     o'tdi
Sardor Aliyev                 71.7       C     o'tdi
Malika Yusupova               94.7       A     o'tdi
Bekzod Rasulov                55.0       F   o'tmadi
----------------------------------------------------
Guruh o'rtachasi:             76.6
====================================================
Amaliy topshiriq

geometriya.py faylida quyidagi funksiyalarni yozing:

  1. doira_yuzasi(radius) - doira yuzasini qaytarsin.
  2. togri_turtburchak_yuzasi(eni, boyi) - to'rtburchak yuzasi.
  3. uchburchak_yuzasi(asos, balandlik) - uchburchak yuzasi.
  4. Har biriga docstring va type hint yozing.
  5. *args bilan eng_katta(*sonlar) funksiyasini yarating.

Xulosa #

  • Funksiya def nomi(parametrlar): shaklida e'lon qilinadi.
  • return qiymat qaytaradi va funksiyani darhol tugatadi.
  • Standart qiymat sifatida hech qachon o'zgaruvchan obyekt ([], {}) ishlatmang.
  • *args va **kwargs noma'lum sonli argumentlarni qabul qiladi.
  • Lokal o'zgaruvchi tashqarida ko'rinmaydi; global dan iloji boricha qoching.
  • lambda - bir satrlik funksiya, sorted, filter, map bilan qulay.

Keyingi bo'limda tayyor kodlardan foydalanishni - modullar va paketlarni 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.