11-bo‘lim
Funksiyalar
Kodni qayta ishlatish: funksiya yaratish, parametrlar, standart qiymatlar, *args va **kwargs, ko'rinish sohasi, lambda va rekursiya.
Ushbu bo‘lim mundarijasi
- Funksiya yaratish
- Parametrlar va argumentlar
- Bir nechta parametr
- Standart qiymatlar
- return - qiymat qaytarish
- Bir nechta qiymat qaytarish
- *args - noma'lum sonli argumentlar
- **kwargs - noma'lum sonli nomli argumentlar
- Hammasini birga ishlatish
- Ko'rinish sohasi (scope)
- Turlarni ko'rsatish (type hints)
- lambda - anonim funksiya
- Rekursiya
- Amaliy misol: talaba baholari moduli
- 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 #
def salomlashish():
"""Ekranga salomlashish xabarini chiqaradi."""
print("Salom!")
print("Xush kelibsiz.")
salomlashish() # chaqirish
salomlashish() # yana chaqirish
Salom!
Xush kelibsiz.
Salom!
Xush kelibsiz.
Tuzilishi:
| Qism | Misol | Izoh |
|---|---|---|
def kalit so'zi | def | Funksiya e'lon qilinadi |
| Nomi | salomlashish | snake_case uslubida |
| Qavslar | () | Parametrlar shu yerda |
| Ikki nuqta | : | Majburiy |
| Docstring | """...""" | Funksiya nima qilishini tushuntiradi |
| Tana | chekingan kod | Funksiya mantiqi |
Parametrlar va argumentlar #
def salomlashish(ism):
print(f"Salom, {ism}!")
salomlashish("Husanboy")
salomlashish("Sardor")
Salom, Husanboy!
Salom, Sardor!
- Parametr - funksiya ta'rifidagi o'zgaruvchi (
ism). - Argument - chaqirishda uzatiladigan haqiqiy qiymat (
"Husanboy").
Bir nechta parametr #
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)
Husanboy, 25 yosh, Namangan shahridan
Sardor, 25 yosh, Toshkent shahridan
Standart qiymatlar #
def salomlashish(ism, salom="Salom"):
print(f"{salom}, {ism}!")
salomlashish("Husanboy")
salomlashish("Sardor", "Assalomu alaykum")
Salom, Husanboy!
Assalomu alaykum, Sardor!
def royxatga_qosh(element, royxat=[]): # XATO!
royxat.append(element)
return royxat
print(royxatga_qosh("a"))
print(royxatga_qosh("b"))
['a']
['a', 'b'] <- kutilmagan natija!
Sabab: standart qiymat funksiya e'lon qilinganda bir marta yaratiladi. To'g'ri yechim:
def royxatga_qosh(element, royxat=None):
if royxat is None:
royxat = []
royxat.append(element)
return royxat
return - qiymat qaytarish #
def yigindi(birinchi, ikkinchi):
return birinchi + ikkinchi
natija = yigindi(15, 27)
print(natija)
print(yigindi(100, 200) * 2)
42
600
return funksiyani darhol tugatadi:
def bolish(bolinuvchi, boluvchi):
if boluvchi == 0:
return "Nolga bo'lib bo'lmaydi"
return bolinuvchi / boluvchi
print(bolish(10, 2))
print(bolish(10, 0))
5.0
Nolga bo'lib bo'lmaydi
Bir nechta qiymat qaytarish #
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}")
Eng past: 78
Eng yuqori: 95
O'rtacha: 87.6
Vergul bilan ajratilgan qiymatlar avtomatik kortejga aylanadi. natija = statistika(baholar) desangiz, natija kortej bo'ladi.
*args - noma'lum sonli argumentlar #
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())
3
15
0
**kwargs - noma'lum sonli nomli argumentlar #
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")
Foydalanuvchi profili:
ism : Husanboy
yosh : 25
shahar : Namangan
kasb : dasturchi
Hammasini birga ishlatish #
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="*")
************************************
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) #
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
120000.0
Global o'zgaruvchini funksiya ichida o'zgartirish uchun global kalit so'zi kerak:
hisoblagich = 0
def ortdir():
global hisoblagich
hisoblagich += 1
ortdir()
ortdir()
ortdir()
print(hisoblagich)
3
global dan iloji boricha qochingGlobal o'zgaruvchini o'zgartirish kodni kuzatishni qiyinlashtiradi. Yaxshiroq yechim - qiymatni return bilan qaytarish:
def ortdir(joriy):
return joriy + 1
hisoblagich = ortdir(hisoblagich)
Turlarni ko'rsatish (type hints) #
Python turlarni majburlamaydi, lekin ularni hujjat sifatida yozish mumkin:
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"))
85.0
Husanboy Qodirov
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:
# 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)
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:
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))
120
3628800
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 #
# ============================================
# 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)
====================================================
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
====================================================
geometriya.py faylida quyidagi funksiyalarni yozing:
doira_yuzasi(radius)- doira yuzasini qaytarsin.togri_turtburchak_yuzasi(eni, boyi)- to'rtburchak yuzasi.uchburchak_yuzasi(asos, balandlik)- uchburchak yuzasi.- Har biriga docstring va type hint yozing.
*argsbilaneng_katta(*sonlar)funksiyasini yarating.
Xulosa #
- Funksiya
def nomi(parametrlar):shaklida e'lon qilinadi. returnqiymat qaytaradi va funksiyani darhol tugatadi.- Standart qiymat sifatida hech qachon o'zgaruvchan obyekt (
[],{}) ishlatmang. *argsva**kwargsnoma'lum sonli argumentlarni qabul qiladi.- Lokal o'zgaruvchi tashqarida ko'rinmaydi;
globaldan iloji boricha qoching. lambda- bir satrlik funksiya,sorted,filter,mapbilan qulay.
Keyingi bo'limda tayyor kodlardan foydalanishni - modullar va paketlarni 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.