Asosiy qismga o'tish

Funksiyalar

13-bob 24 kod bloki 2072 so'z

Bu bobda

  • o'z funksiyangizni def bilan yozishni
  • parametr va argument farqini, nomli argumentlarni, standart qiymatlarni
  • return va print ning 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:

python6 qator
def salomlash():
    print("Assalomu alaykum!")
    print("Darsga xush kelibsiz.")

salomlash()
salomlash()
Natija
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

python5 qator
def salomlash():
    print("Assalomu alaykum!")

salomlash
print(salomlash)
Natija
<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:

python5 qator
def salom(ism):
    print(f"Salom, {ism.capitalize()}!")

salom("abulqosim")
salom("sarvinoz")
Natija
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:

python5 qator
def uy_hayvoni(turi, ismi):
    print(f"Menda {turi} bor, uning ismi {ismi.capitalize()}.")

uy_hayvoni("mushuk", "jek")
uy_hayvoni("jek", "mushuk")
Natija
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:

python4 qator
def uy_hayvoni(turi, ismi):
    print(f"Menda {turi} bor, uning ismi {ismi.capitalize()}.")

uy_hayvoni(ismi="simba", turi="kuchuk")
Natija
Menda kuchuk bor, uning ismi Simba.

Standart qiymat

Parametrga standart (default) qiymat bersangiz, chaqirganda uni tashlab ketish mumkin:

python5 qator
def uy_hayvoni(ismi, turi="kuchuk"):
    print(f"Menda {turi} bor, uning ismi {ismi.capitalize()}.")

uy_hayvoni("rex")
uy_hayvoni("mosh", "mushuk")
Natija
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

python4 qator
def uy_hayvoni(turi, ismi):
    print(turi, ismi)

uy_hayvoni("mushuk")
Xato xabari
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:

python6 qator
def toliq_ism(ism, familiya):
    return f"{ism} {familiya}".title()

talaba = toliq_ism("sarvinoz", "karimova")
print(talaba)
print(len(talaba))
Natija
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.

python10 qator
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)
Natija
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:

python4 qator
def kvadrat_print(x):
    print(x * x)

natija = kvadrat_print(5) + 1
Natija
25
Xato xabari
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:

python10 qator
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))
Natija
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:

python7 qator
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"))
Natija
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:

python5 qator
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)
Natija
30 95

Lug'at qaytarish ham ko'p uchraydi:

python8 qator
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"))
Natija
{'ism': 'jimi', 'familiya': 'hendrix', 'yosh': 27}
{'ism': 'ali', 'familiya': 'valiyev'}

None — "qiymat berilmadi" uchun eng to'g'ri standart qiymat.

Funksiyaga ro'yxat berish

python5 qator
def salomlash_hammaga(ismlar):
    for ism in ismlar:
        print(f"Salom, {ism.capitalize()}!")

salomlash_hammaga(["hannah", "jek", "margot"])
Natija
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.

python8 qator
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)
Natija
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:

python13 qator
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__)
Natija
(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.
  • return qiymat qaytaradi va funksiyani tugatadi; return siz funksiya None qaytaradi.
  • Hisoblovchi funksiya return qilsin, print qilmasin.
  • 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.

Proc1

kub(a) funksiyasini yozing: u a³ ni qaytaradi. Kiritilgan son uchun natijani chiqaring.

KirishKutilgan natija
28
-3-27
1.53.375
Yechimni ko'rish
python4 qator
def kub(a):
    return a ** 3

print(kub(float(input())))
Proc2

darajalar(a) funksiyasini yozing: u a², a³, a⁴ ni kortej sifatida qaytaradi. Uchalasini chiqaring.

KirishKutilgan natija
24 8 16
-11 -1 1
39 27 81
Yechimni ko'rish
python4 qator
def darajalar(a):
    return a ** 2, a ** 3, a ** 4

print(*darajalar(int(input())))
Proc3

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.

KirishKutilgan natija
4, 96.5 6
2, 85 4
1, 11 1
Yechimni ko'rish
python4 qator
def ortachalar(x, y):
    return (x + y) / 2, (x * y) ** 0.5

print(*ortachalar(float(input()), float(input())))
13.1

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.

KirishKutilgan natija
92 71 56 105 4 3 2
100 05 2
Yechimni ko'rish
python10 qator
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()])
13.2

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.

KirishKutilgan natija
202 3 5 7 11 13 17 19
22
102 3 5 7
Yechimni ko'rish
python10 qator
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)])
13.3

ekub(a, b) funksiyasini Evklid algoritmi bilan yozing (8-bob, While23). Uni ishlatib, kasrni qisqartiring: surat va maxraj berilgan, qisqargan surat va maxrajni chiqaring.

KirishKutilgan natija
12, 182 3
7, 57 5
100, 254 1
Yechimni ko'rish
python9 qator
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)
13.4

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).

KirishKutilgan natija
19 55 10019
123 321123
9 819
Yechimni ko'rish
python9 qator
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.

Telegramda yozish Narxlar