Funksiyalar
Bu bobda
- o'z funksiyangizni
defbilan yozishni - parametr va argument farqini, nomli argumentlarni, standart qiymatlarni
returnvaprintning farqini (eng ko'p uchraydigan xato)- bir nechta qiymat qaytarishni
- funksiyaga ro'yxat berganda nima bo'lishini
Nega funksiya kerak?
Bir xil kodni dasturning uch joyida yozdingiz. Keyin unda xato topildi — uch joyda tuzatasiz, bittasini unutasiz. Funksiya — nom berilgan kod bo'lagi: bir marta yoziladi, istalgancha chaqiriladi.
Biz allaqachon ko'p funksiya ishlatdik: print(), len(), input(), round(). Endi o'zimiznikini yozamiz:
def salomlash(): print("Assalomu alaykum!") print("Darsga xush kelibsiz.") salomlash() salomlash()
Assalomu alaykum! Darsga xush kelibsiz. Assalomu alaykum! Darsga xush kelibsiz.
def— "funksiya aniqlayman" (define).salomlash— funksiya nomi; o'zgaruvchilar kabi snake_case.()va:— majburiy.- Ichidagi kod 4 probel ichkarida.
def faqat funksiyani yaratadi, ishga tushirmaydi. Ishga tushirish — chaqirish: salomlash().
Qavsni unutish
def salomlash(): print("Assalomu alaykum!") salomlash print(salomlash)
<function salomlash at 0x7fb0d0648550>
Qavssiz salomlash — funksiyaning o'zi, chaqiruv emas. Hech narsa bajarilmadi, xato ham chiqmadi — shuning uchun bu xatoni topish qiyin.
Parametrlar
Funksiyaga ma'lumot berish uchun qavs ichida parametr yoziladi:
def salom(ism): print(f"Salom, {ism.capitalize()}!") salom("abulqosim") salom("sarvinoz")
Salom, Abulqosim! Salom, Sarvinoz!
- Parametr — funksiya ta'rifidagi nom:
ism. - Argument — chaqirganda beriladigan qiymat:
"abulqosim".
Bir nechta parametr vergul bilan yoziladi. Argumentlar tartib bo'yicha parametrlarga tushadi:
def uy_hayvoni(turi, ismi): print(f"Menda {turi} bor, uning ismi {ismi.capitalize()}.") uy_hayvoni("mushuk", "jek") uy_hayvoni("jek", "mushuk")
Menda mushuk bor, uning ismi Jek. Menda jek bor, uning ismi Mushuk.
Ikkinchi chaqiruvda tartib almashdi va ma'no buzildi. Python buni xato deb bilmaydi.
Nomli argumentlar
Argumentni nomi bilan bersangiz, tartib muhim emas:
def uy_hayvoni(turi, ismi): print(f"Menda {turi} bor, uning ismi {ismi.capitalize()}.") uy_hayvoni(ismi="simba", turi="kuchuk")
Menda kuchuk bor, uning ismi Simba.
Standart qiymat
Parametrga standart (default) qiymat bersangiz, chaqirganda uni tashlab ketish mumkin:
def uy_hayvoni(ismi, turi="kuchuk"): print(f"Menda {turi} bor, uning ismi {ismi.capitalize()}.") uy_hayvoni("rex") uy_hayvoni("mosh", "mushuk")
Menda kuchuk bor, uning ismi Rex. Menda mushuk bor, uning ismi Mosh.
Standart qiymatli parametrlar oxirida turishi kerak: def f(turi="kuchuk", ismi) — SyntaxError.
Argumentlar soni mos kelmasa
def uy_hayvoni(turi, ismi): print(turi, ismi) uy_hayvoni("mushuk")
TypeError: uy_hayvoni() missing 1 required positional argument: 'ismi'
Python qaysi parametr yetishmayotganini aniq aytadi.
return: natijani qaytarish
Hozirgacha funksiyalarimiz natijani chiqardi (print). Ko'pincha esa natijani qaytarish kerak — keyin uni saqlash, solishtirish, boshqa hisobga qo'shish uchun:
def toliq_ism(ism, familiya): return f"{ism} {familiya}".title() talaba = toliq_ism("sarvinoz", "karimova") print(talaba) print(len(talaba))
Sarvinoz Karimova 17
return ikki ish qiladi: qiymatni chaqirgan joyga qaytaradi va funksiyani darhol tugatadi.
print va return ni adashtirish
Bu kitobdagi eng muhim "xato" qutisi.
def kvadrat_print(x): print(x * x) def kvadrat_return(x): return x * x a = kvadrat_print(5) b = kvadrat_return(5) print("a =", a) print("b =", b)
25 a = None b = 25
kvadrat_print(5) 25 ni ekranga yozdi, lekin hech narsa qaytarmadi. return bo'lmagan funksiya None qaytaradi, shuning uchun a = None. Endi a + 1 desangiz — xato:
def kvadrat_print(x): print(x * x) natija = kvadrat_print(5) + 1
25
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
Qoida: hisoblovchi funksiya return qilsin; chiqarishni chaqirgan joy hal qilsin.
return dan keyingi kod bajarilmaydi. Bu shartli qaytarishda qulay:
def baho(ball): if ball >= 86: return 5 if ball >= 71: return 4 if ball >= 56: return 3 return 2 print(baho(92), baho(75), baho(60), baho(30))
5 4 3 2
elif shart emas: birinchi mos return funksiyani tugatadi.
Ixtiyoriy argument
O'rta ism ba'zilarda bor, ba'zilarda yo'q. Standart qiymat sifatida bo'sh satr beramiz va uni oxirgi parametr qilamiz:
def toliq_ism(ism, familiya, otasining_ismi=""): if otasining_ismi: return f"{familiya} {ism} {otasining_ismi}".title() return f"{familiya} {ism}".title() print(toliq_ism("abulqosim", "rafiqov")) print(toliq_ism("abulqosim", "rafiqov", "rustamovich"))
Rafiqov Abulqosim Rafiqov Abulqosim Rustamovich
Tartibga e'tibor
Parametrlar (ism, familiya, otasining_ismi) tartibida bo'lgani uchun, chaqiruvda ham shu tartib: toliq_ism("john", "lee", "marry") → Lee John Marry. Agar chaqiruvda tartib adashsa ("john", "marry", "lee"), Python marry ni familiya deb oladi — xato bermaydi, lekin natija noto'g'ri. Shubha bo'lsa, nomli argument yozing: toliq_ism(ism="john", familiya="lee", otasining_ismi="marry").
Bir nechta qiymat qaytarish
return a, b — aslida kortej qaytaradi (10-bob), uni darhol ochish mumkin:
def min_max(sonlar): return min(sonlar), max(sonlar) eng_kichik, eng_katta = min_max([45, 88, 72, 30, 95]) print(eng_kichik, eng_katta)
30 95
Lug'at qaytarish ham ko'p uchraydi:
def odam_yasash(ism, familiya, yosh=None): odam = {"ism": ism, "familiya": familiya} if yosh: odam["yosh"] = yosh return odam print(odam_yasash("jimi", "hendrix", yosh=27)) print(odam_yasash("ali", "valiyev"))
{'ism': 'jimi', 'familiya': 'hendrix', 'yosh': 27}
{'ism': 'ali', 'familiya': 'valiyev'}None — "qiymat berilmadi" uchun eng to'g'ri standart qiymat.
Funksiyaga ro'yxat berish
def salomlash_hammaga(ismlar): for ism in ismlar: print(f"Salom, {ism.capitalize()}!") salomlash_hammaga(["hannah", "jek", "margot"])
Salom, Hannah! Salom, Jek! Salom, Margot!
Funksiya asl ro'yxatni o'zgartiradi
9-bobdagi "yorliq" g'oyasi funksiyalarda ham ishlaydi: funksiya ro'yxatning nusxasini emas, o'zini oladi.
def bajarildi_deb_belgila(vazifalar): while vazifalar: v = vazifalar.pop() print("Bajarildi:", v) royxat = ["uy ishi", "kitob o'qish", "sport"] bajarildi_deb_belgila(royxat) print("Ro'yxat endi:", royxat)
Bajarildi: sport Bajarildi: kitob o'qish Bajarildi: uy ishi Ro'yxat endi: []
Ro'yxat bo'shab qoldi! Asl ro'yxat kerak bo'lsa, nusxasini bering: bajarildi_deb_belgila(royxat[:]).
Hujjatlash: docstring
Funksiyaning birinchi qatoridagi uchtalik qo'shtirnoqli matn — docstring. U funksiya nima qilishini tushuntiradi va help() da chiqadi:
def kvadrat_tenglama(a, b, c): """ax² + bx + c = 0 ning haqiqiy ildizlarini o'sish tartibida qaytaradi.""" d = b * b - 4 * a * c if d < 0: return () x1 = (-b - d ** 0.5) / (2 * a) x2 = (-b + d ** 0.5) / (2 * a) return tuple(sorted({x1, x2})) print(kvadrat_tenglama(1, -5, 6)) print(kvadrat_tenglama(1, -6, 9)) print(kvadrat_tenglama(1, 2, 5)) print(kvadrat_tenglama.__doc__)
(2.0, 3.0) (3.0,) () ax² + bx + c = 0 ning haqiqiy ildizlarini o'sish tartibida qaytaradi.
6-bobdagi 20 qatorli kvadrat tenglama endi bitta qatorda chaqiriladi va natijasini istalgan joyda ishlatish mumkin. Bu — funksiyaning asl kuchi.
Kitoblarda
- Python asoslari: Funksiyalar 66–70-betlar.
- Python Crash Course: 8-bob Functions 129–148-betlar (Passing Arguments 131-bet, Return Values 137-bet, Passing a List 143-bet).
Xulosa
def nom(parametrlar):— yaratish;nom(argumentlar)— chaqirish; qavssiz — chaqiruv emas.- Argumentlar tartib bo'yicha yoki nomi bilan; standart qiymatli parametrlar oxirida.
returnqiymat qaytaradi va funksiyani tugatadi;returnsiz funksiyaNoneqaytaradi.- Hisoblovchi funksiya
returnqilsin,printqilmasin. return a, b— kortej; funksiya asl ro'yxatni o'zgartirishi mumkin.
Mashqlar
Har bir mashqda avval funksiyani yozing, keyin input() dan qiymat olib, funksiyani chaqiring va natijani chiqaring.
kub(a) funksiyasini yozing: u a³ ni qaytaradi. Kiritilgan son uchun natijani chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 2 | 8 |
| -3 | -27 |
| 1.5 | 3.375 |
Yechimni ko'rish
def kub(a): return a ** 3 print(kub(float(input())))
darajalar(a) funksiyasini yozing: u a², a³, a⁴ ni kortej sifatida qaytaradi. Uchalasini chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 2 | 4 8 16 |
| -1 | 1 -1 1 |
| 3 | 9 27 81 |
Yechimni ko'rish
def darajalar(a): return a ** 2, a ** 3, a ** 4 print(*darajalar(int(input())))
ortachalar(x, y) funksiyasini yozing: u o'rta arifmetik (x + y) / 2 va o'rta geometrik √(x·y) ni qaytaradi (x, y > 0). Ikkalasini chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 4, 9 | 6.5 6 |
| 2, 8 | 5 4 |
| 1, 1 | 1 1 |
Yechimni ko'rish
def ortachalar(x, y): return (x + y) / 2, (x * y) ** 0.5 print(*ortachalar(float(input()), float(input())))
baho(ball) funksiyasini yozing: 86–100 → 5, 71–85 → 4, 56–70 → 3, qolgani → 2. Bir qatorda bir nechta ball berilgan; har biri uchun bahoni probel bilan chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 92 71 56 10 | 5 4 3 2 |
| 100 0 | 5 2 |
Yechimni ko'rish
def baho(ball): if ball >= 86: return 5 if ball >= 71: return 4 if ball >= 56: return 3 return 2 print(*[baho(int(s)) for s in input().split()])
tubmi(n) funksiyasini yozing: n tub son bo'lsa True, aks holda False qaytaradi (n > 1). Uni ishlatib, 2 dan N gacha bo'lgan barcha tub sonlarni chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 20 | 2 3 5 7 11 13 17 19 |
| 2 | 2 |
| 10 | 2 3 5 7 |
Yechimni ko'rish
def tubmi(n): d = 2 while d * d <= n: if n % d == 0: return False d += 1 return True n = int(input()) print(*[i for i in range(2, n + 1) if tubmi(i)])
ekub(a, b) funksiyasini Evklid algoritmi bilan yozing (8-bob, While23). Uni ishlatib, kasrni qisqartiring: surat va maxraj berilgan, qisqargan surat va maxrajni chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 12, 18 | 2 3 |
| 7, 5 | 7 5 |
| 100, 25 | 4 1 |
Yechimni ko'rish
def ekub(a, b): while b: a, b = b, a % b return a s = int(input()) m = int(input()) e = ekub(s, m) print(s // e, m // e)
raqamlar_yigindisi(n) funksiyasini yozing: musbat butun n ning raqamlari yig'indisini qaytaradi. Bir qatorda bir nechta son berilgan; raqamlari yig'indisi eng katta bo'lgan sonni chiqaring (bir nechta bo'lsa — birinchisi).
| Kirish | Kutilgan natija |
|---|---|
| 19 55 100 | 19 |
| 123 321 | 123 |
| 9 81 | 9 |
Yechimni ko'rish
def raqamlar_yigindisi(n): s = 0 while n > 0: s += n % 10 n //= 10 return s sonlar = [int(x) for x in input().split()] print(max(sonlar, key=raqamlar_yigindisi))
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.