Python logo

Python dasturlash tili: 6-dars.

                                                                                                 Funksiyalar

Funksiya – bu ko’p marta ishlatiladigan dastur bo’lagi. Funksiyalar ma’lum buyruqlar blokini ko’rsatilgan nom bilan saqlash va shu blokni dasturning istalgan joyida, istalgan miqdorda bajarish imkonini beradi. Biz oldingi darslarimizda len va range Python funksiyalari bilan tanishgan edik.

Funksiyalar def zahira so’zi orqali aniqlanadi. Bu so’zdan so’ng funksiya nomi, undan so’ng qavs va shu qavs ichida bir necha o’zgaruvchilarni ko’rsatish mumkin bo’ladi va oxirida ikki nuqta (:) yoziladi. Shulardan so’ng funksiyani tashkil qiluvchi buyruqlar bloki yoziladi. Quyidagi misolda buning oson ekanligini ko’rish mumkin.

Misol: (function1.py nomi bilan saqlang)

 

 

  1. def sayHello():
  2.  
  3. print('Salom, Dunyo!') # funksiyaga tegishli blok
  4.  
  5. # Funksiya oxiri
  6.  
  7.  
  8. sayHello() # funksiyani chaqirish
  9.  
  10. sayHello() # ya’na bir marta funksiyani chaqirish

 

 

Natija:

  1. $ python function1.py
  2. Salom, Dunyo!
  3. Salom, Dunyo!

 

Bu qanday ishlaydi:

Biz sayHello funksiyasini yuqorida aytib o’tilgan qoida bo’yicha aniqladik. Bu funksiya xech qanday paramert qabul qilmaydi shuning uchun qavs ichida xech qanday parametr yozilmadi. Funksiya parametri – bu qandaydir kiruvchi qiymatlar bo’lib, tegishli natija olish uchun biz uni funksiyaga berishimiz mumkin.

E’tibor bering, bitta funksiyani ko’p marta chaqirishimiz mumkin, demak, aynan bir xil dastur kodini qayta-qayta yozishga hojat yo’q.

Funksiya parametrlari

Funksiyalar parametrlar, ya’ni funksiyaga berilishi mumkin bo’lgan qiymatlar qabul qila oladi va ular ustuda biror amal bajarishi mumkin. Bu parametrlar o’zgaruvchilarga o’xshaydi. Faqat ulardan farqi bu o’zgaruvchilarning qiymati funksiyani chaqirish vaqtida o’rnatiladi. Funksiya ish boshlagan vaqtda bularga qiymat biriktirilgan bo’ladi.

Parametrlar funksiya aniqlanayotgan vaqtda qavs ishida vergul bilan ajratilgasn holda ko’rsatiladi. Ularga qiymatni funksiyani chaqirganimizda biriktiramiz. Ushbu atamalarga e’tibor bering: funksiya e’lon qilinayotgan vaqtda ko’rsatilgan nomlar parametrlar, funksiyani chaqirayotganimizda unga berilgan qiymatlar esa argumentlar deyiladi.

Misol: ( func_param.py nomi bilan saqlang )

 

  1. def printMax(a, b):
  2.  
  3.     if a > b:
  4.  
  5.         print(a, 'katta')
  6.  
  7.     elif a == b:
  8.  
  9.         print(a, 'teng', b)
  10.  
  11.     else:
  12.  
  13.         print(b, 'katta')
  14.  
  15.  
  16.  
  17. printMax(3, 4) # qiymatlarni to'g'ridan-to'g'ri berish
  18.  
  19.  
  20.  
  21. x = 5
  22.  
  23. y = 7
  24.  
  25.  
  26.  
  27. printMax(x, y) # o'zgaruvchilarni argument sifatida uzatish.

 

  1. $ python func_param.py
  2. 4 katta
  3. 7 katta

 

Bu qanday ishlaydi:

Bu yerda biz a va b parametrlardan foydalanadigan printMax funksiyasini e’lon qildik. Bu funksiyada oddiygina if..else operatoridan foydalangan holda sonlarning kattasini aniqlaymiz va uni ekranga chop etamiz.

printMax funksiyasini birinchi marta chaqirganimizda sonlarni to’g’ridan-to’gri argument sifatida beramiz. Ikkinchi marta chaqirganimizda esa o’zgaruvchilarni argument sifatida beramiz. printMax(x, y) x argument qiymatini a parametrga, y argument qiymatini esa b parametrga biriktiradi. Yuqoridagi ikkala holatda ham funksiya bir xilda ishlaydi.

mahalliy(локальные) parametrlar.

Funksiyaning ichida e’lon qilingan o’zgaruvchilar huddi shu nomdagi funksiya tashqarisida e’lon qilingan o’zgaruvchilar bilan xech qanday bog’liklikka ega emas, ya’ni bu o’zgaruvchilar mahalliy o’zgaruvchilar hisoblanadi. Bu o’zgaruvchining ko’rinish maydoni(область видимости) deyiladi. Har bir o’zgaruvchining ko’rinish maydoni o’zgaruvchi aniqlangan amallar bloki va shu o’zgaruvchi e’lon qilingan nuqta bilan chegaralangan.

 

Misol:(func_local.py nomi bilan saqlang)

 

  1. x = 50
  2.  
  3. def func(x):
  4.  
  5.     print("x teng", x)
  6.  
  7.     x = 2
  8.  
  9.     print("Mahalliy x qiymatini", x, "ga o'zgartiramiz")
  10.  
  11. func(x)
  12.  
  13. print("x qiymati qanday bo'lsa, shunday turibdi", x)

 

Natija:

  1. $ python func_local.py
  2. x teng 50
  3. Mahalliy x qiymatini 2 ga o'zgartiramiz
  4. x qiymati qanday bo'lsa, shunday turibdi 50

Bu qanday ishlaydi:

Funksiyaning birinchi qatorida, x o’zgaruvchisiga biriktirilgan qiymatni birinchi bor chop etishda Python funksiyaning yuqorisida, ya’ni asosiy blokda e’lon qilingan parametrning qiymatidan foydalanadi.

So’ng x o’zgaruvchiga 2 qiymatni biriktiramiz. x o’zgaruvchisi bizning funksiyamiz uchun mahalliy hisoblanadi. Shuning uchun x o’zgaruvchining qiymatini funksiya ichida o’zgartirganimizda, funksiya tashqarisida aniqlangan x o’zgaruvchi qiymati xech qanday o’zgarishsiz qoladi.

Dastur oxirida print funksiyasi yordamida asosiy blokda aniqlangan x o’zgaruvchisi qiymatini chop etamiz va funksiya ichida x o’zgaruvchisi qiymatining o’zgartirilishi xech qanday ta’sir qilmaganligini ko’rishimiz mumkin bo’ladi.

 

“global” zahira so’zi (зарезервированное слово)

Funksiya ichidagi biror o’zgaruvchiga yuqori darajadagi biror qiymatni (funksiya yoki klassning ko’rinish maydoni emas) biriktirish uchun Pythonga uning nomi mahalliy emas global ekanligini ko’rsatish darkor. Buni “global” zahira so’zi yordamida amalga oshirish mumkin. “global” zahira so’zini ko’rsatmasdan funksiya tashqarisida aniqlangan biror o’zgaruvchi qiymatini biriktirib bo’lmaydi.

Funksiya tashqarisida aniqlangan biror o’zgaruvchi qiymatini funksiya ichida ishlatish mumkin (faqat sharti funksiya ichida huddi shu nom bilan biror o’zgaruvchi aniqlanmagan bo’lishi kerak). Lekin bunday holatlardan qochish kerak. Sababi dastur kodini o’qiyotgan odamga o’zgaruvchi qayerda aniqlanganligi tushunarsiz bo’lishi mumkin.

“global” zahira so’zini ishlatish esa o’zgaruvchi eng yuqori blokda aniqlanganini aniq ko’rsatadi.

Misol: (func_global.py nomi bilan saqlang)

 

  1. x = 50
  2.  
  3.  
  4.  
  5. def func():
  6.  
  7.     global x
  8.  
  9.  
  10.  
  11.     print("x teng", x)
  12.  
  13.     x = 2
  14.  
  15.     print("Global x qiymatini", x, "ga o'zgartiramiz")
  16.  
  17.  
  18.  
  19. func()
  20.  
  21. print("x ning qiymati", x)

Natija:

  1. $ python func_global.py
  2. x teng 50
  3. Global x qiymatini 2 ga o'zgartiramiz
  4. x ning qiymati 2

Bu qanday ishlaydi:

“global” zahira so’zi funksiya ichidagi o’zgaruvchini global o’zgaruvchi ekanligini bildiradi va bu shuni anglatadiki qachonki biz bu o’zgaruvchi qiymatini funksiya ichida o’zgartirsak, bu o’zgarish asosiy blokdagi o’zgaruvchi qiymatida xam aks etadi.

Bitta “global” zahira so’zi yordamida bir necha o’zgaruvchini aniqlash mumkin:

global x, y, z

“nonlocal” zahira so’zi

Biz qanday qilib global va mahalliy o’zgaruvchilarga murojat qilishni ko’rib chiqdik. Ya’na bir korinish maydoni borki, bu maydon global va mahalliy maydonlar o’rtasini bildiruvchi “mahalliy emas” (нелокальной) ko’rinish maydoni mavjud. Bu ko’rinish maydoni siz funksiya ichida funksiya aniqlaganingizda uchraydi.

Pythonda funksiyani xohlagan joyingizda aniqlashingiz mumkin.

 

Misol: (func_nonlocal.py nomi bilan saqlang)

 

  1. def func_outer():
  2.  
  3.     x = 2
  4.  
  5.     print("x teng", x)
  6.  
  7.  
  8.  
  9.     def func_inner():
  10.  
  11.         nonlocal x
  12.  
  13.         x = 5
  14.  
  15.     func_inner()
  16.  
  17.     print("maxalliy x", x, "ga o'zgardi")
  18.  
  19.  
  20.  
  21. func_outer()

 

Natija:

  1. $ python func_nonlocal.py
  2. x teng 2
  3. maxalliy x 5 ga o'zgardi

Bu qanday ishlaydi:

func_inner funksiyasi birinchi qatorida aniqlangan x o’zgaruvchi mahalliy ko’rinish maydonida emas (o’zgaruvchini aniqlash func_inner blokiga kirmaydi), global ko’rinish maydonida ham emas (o’zgaruvchi dasturning asosiy blokida ham emas). Biz aynan x o’zgaruvchini ishlatish uchun uni quyidagich e’lon qilamiz: nonlocal x.

 

nonlocal x” yozuvini “global x” yozuviga, keyin esa “global” zahira so’zini o’chirib tashlang va bu ikki holdagi o’zgarishlarni kuzating.

 

Argumentlarning qiymat ko’rsatilmaganda ishlatiladigan qiymati (Значения аргументов по умолчанию)

Ko’p hollarda funksiyaning ba’zi parametrlari majburiy bo’lmasligi mumkin. Agar dasturchi  bunday parametrlar uchun qiymat bermasa, u holda funksiya aniqlanishida ko’rsatilgan qiymat (значение по умолчанию) ishlatiladi. Buning uchun funksiya e’lon qilinish joyida parametr nomidan keyin o’zlashtirish operatori (=) va undan so’ng biror qiymat beriladi.

 

E’tibor bering, funksiya aniqlanishida ko’rsatilgan qiymat (значение по умолчанию) konstanta bo’lishi kerak. Yoki aniqroq qilib aytganda qiymati o’zgarmas bo’lishi kerak.

 

Misol: (func_default.py nomi bilan saqlang)

 

  1. def say(message, times = 1):
  2.  
  3.     print(message * times)
  4.  
  5.  
  6.  
  7. say('Salom')
  8.  
  9. say('Dunyo', 5)

Natija:

  1. Salom
  2. DunyoDunyoDunyoDunyoDunyo

Bu qanday ishlaydi:

 

say funksiyasi satrni ko’rsatilgan miqdorda ekranga chop etish uchun foydalaniladi. Agar biz qiymat ko’rsatmasak satr bir marta chop etiladi. Biz bunga times parametriga boshlang’ich 1 qiymatini berib erishishimiz mumkin.

 

say funksiyasini birinchi marta chaqirganimizda biz unga faqat satr qiymatini beramiz va funksiya uni bir marta chop etadi. Ikkinchi marta chaqirganimizda esa berilgan satrni 5 marta takrorlashni ko’zda tutgan holda unga 5 qiymatli argument beramiz. Boshlang’ich qiymat bilan parametrlar ro’yxati oxiridagi parametrlar qiymatlanishi mumkin. Shunday qilib boshlang’ich qiymatli parametrlar qiymatsiz parametrlardan oldin kelmasligi kerak.

Bu parametrlarga qiymatlar ularning joylashuviga qarab biriktirilishi bilan bog’liq. Misol uchun, def func(a, b=5) mumkin, lekin def func(a=5, b) kabi e’lon qilish mumkin emas.

 

Kalit argumentlar (Ключевые аргументы)

Agar biror funksiya ko’p parametrga ega bo’lsa va uni chaqirish joyida bu parametrlardan faqat ayrimlariga qiymat ko’rsatilishi kerak bo’lsa, u holda bu parametrlar qiymatlari ularning nomi bo’yicha berilishi mumkin – bu kalit parametrlar deyiladi. Bu holda argumentlarni berish uchun ularning pozitsiyasi emas, nomi (kalit) ishlatiladi.

Bunday uslubni ikki xil afzalligi mavjud: birinchidan, funksiyadan foydalanish oson bo’ladi. Sababi argumentlarning ketma-ketligini rioya qilish zarur bo’lmaydi; ikkinchidan, faqat tanlangan argumentlarga qiymat berish mumkin bo’ladi va qolgan argumentlar boshlang’ich qiymatlarga ega bo’ladi.

 

Misol: (func_key.py nomi bilan saqlang)

  1. def func(a, b=5, c=10):
  2.  
  3.     print('a teng', a, ', b teng', b, ', c teng, c)
  4.  
  5.  
  6.  
  7. func(3, 7)
  8.  
  9. func(25, c=24)
  10.  
  11. func(c=50, a=100)

 

Natija:

  1. $ python func_key.py
  2. a teng 3, b teng 7, c teng 10
  3. a teng 25, b teng 5, c teng 24
  4. a teng 100, b teng 5, c teng 50

Bu qanday ishlaydi:

 

func nomli funksiya bitta boshlang’ich qiymatsiz parametr va ikkita boshlang’ich qiymatli parametrga ega.

 

func(3, 7) funksiyaning birinchi chaqirilishida a parametr 3, b parametr 7, c parametr esa boshlang’ich qiymat 10 qabul qiladi.

 

func(25, c=24) funksiyaning ikkinchi chaqirilishida a parametr argument pozitsiyasi bo’yicha 25 qiymat qabul qiladi. Shundan song c parametr nom ya’ni kalit parametr bo’yicha 24 qiymat qabul qiladi. b parametr esa boshlang’ich qiymatga ko’ra 5 qiymat qabul qiladi.

func(c=50, a=100) funksiyaning uchunchi chaqirilishida biz barcha qiymatlar uchun kalit argumentlardan foydalanamiz. E’tibor bering, funksiyani e’lon qilishda c parametr a parametrdan keyin ko’rsatilgan bo’lsa ham, qiymat biriktirish vaqtida c parametrga a parametrdan oldin qiymat biriktiryapmiz.

 

Ixtiyoriy miqdordagi parametrlar (Переменное число параметров)

 

Ba’zan funksiyani ixtiyoriy miqdordagi parametr qabul qila oladigan holda e’lon qilish kerak bo’lishi mimkin. Bunga yulduzchalar yordamida erishishimiz mumkin.

 

Misol: (total.py nomi bilan saqlang)

 

  1. def total(initial=5, *numbers, **keywords):
  2.  
  3.     count = initial
  4.  
  5.     for number in numbers:
  6.  
  7.         count += number
  8.  
  9.     for key in keywords:
  10.  
  11.         count += keywords[key]
  12.  
  13.     return count
  14.  
  15.  
  16.  
  17. print(total(10, 1, 2, 3, vegetables=50, fruits=100))

 

Natija:

  1. $ python total.py
  2. 166

Bu qanday ishlaydi:

Agar biz parametrni yulduzcha (*) bilan e’lon qiladigan (misol uchun param) bo’lsak, shu pozitsiyadan boshlab oxirigacha bo’lgan barcha pozitsiya argumentlari param nomlik kortejga yig’iladi. Bizning holatda numbers kortejida (1, 2, 3) qiymat mavjud bo’ladi.

 

Shunga o’xshash agar biz ikkita yulduzcha (**) bilan parametrni e’lon qiladigan (misol uchun param) bo’lsak shu pozitsiyadan boshlab oxirigacha bo’lgan kalit argumentlar param nomli lug’at(словарь)ga yig’iladi. Bizning holatda keywords lug’atida {‘vegetables’: 50, ‘fruits’: 100} qiymat mavjud bo’ladi.

 

Biz kortej va lug’atlarni imkon qadar keyingi darslarimizda o’rganamiz.

 

Faqat kalit argumentlar

Agar ba’zi kalit argumentlarga faqat kalit bo’yicha murojaat qilish kerak bo’lsa, u holda yulduzchali parametrdan so’ng bu argumentni e’lon qilish mumkin.

 

Misol: (keyword_only.py nomi bilan saqlang)

 

 

  1. def total(initial=5, *numbers, extra_number):
  2.  
  3.     count = initial
  4.  
  5.  
  6.     for number in numbers:
  7.  
  8.         count += number
  9.  
  10.  
  11.     count += extra_number
  12.  
  13.     print(count)
  14.  
  15.  
  16.  
  17. total(10, 1, 2, 3, extra_number=50)
  18.  
  19. total(10, 1, 2, 3)
  20. # Xatolik yuz beradi sababi biz 'extra_number' uchun qiymat bermadik.

 

Natija:

  1. $ python keyword_only.py
  2. 66
  3. Traceback (most recent call last):
  4. File "keyword_only.py", line 12, in <module>
  5. total(10, 1, 2, 3)
  6. TypeError: total() needs keyword-only argument extra_number

Bu qanday ishlaydi:

Yulduzchali parametrdan keyin faqat kalitl parametrlar e’lon qilinadi. Agar bunday argumentlar uchun boshlang’ich qiymat berilmagan bo’lsa va funksiyani chaqirilish joyida qiymat berilmasa, xatolik yuz beradi.

Agar sizga faqat kalit argumentlar kerak bo’lsa, lekin yulduzchali parametr kerak bo’lmasa, u xolda shunchaki bitta nomsiz yulduzcha ko’rsatishingiz mumkin:

def total(initial=5, *, number).

 

return operatori

return operatori funksiyani to’xtatish va undan chiqish uchun ishlatiladi. Shu bilan birga funksiyadan biror qiymat qaytarish uchun ham xizmat qiladi.

 

Misol: (func_return.py nomi bilan saqlang)

 

  1. def maximum(x, y):
  2.  
  3.     if x > y:
  4.  
  5.         return x
  6.  
  7.     elif x == y:
  8.  
  9.         return 'Sonlar teng.'
  10.  
  11.     else:
  12.  
  13.         return y
  14.  
  15.  
  16.  
  17. print(maximum(2, 3))

 

Natija:

  1. $ python func_return.py
  2. 3

Bu qanday ishlaydi:

maximum funksiyasi berilgan ikki parametrdan kattasini aniqlaydi. Bu funksiya oddiy if..else shart operatorini sonlarning kattasini aniqlashda foydalanadi va aniqlangan katta sonni qaytaradi.

 

Shunga e’tibor beringki, return operatori qaytarish qiymatisiz return None ifodasiga teng kuchli hisoblanadi.

None Pythondagi xech narsani ifodalovchi maxsus ma’lumot turi hisoblanadi. Misol uchun o’zgaruvchi qiymatiga None biriktirilgan bo’lsa, unga xech qanday qiymat biriktirilmaganiligini bildiradi.

Agar siz funksiyada return operatorini ishlatmagan bo’lsangiz, u holda har bir shunday funksiya tugash joyida oshkormas holda (в неявной форме) return None ifodasi mavjud bo’ladi. Buni amalda ko’rish uchun quyidagi dastur kodini ishga tushirib ko’ring.

 

  1. def someFunction():
  2.  
  3.     pass
  4.  
  5.  
  6. print(def someFunction())

 

pass operatori Pythonda bo’sh buyruqlar blokini ifodalash uchun ishlatiladi.

 

Xujjatlash satrlari(Строки документации)

Python xujjatlash satrlari, qisqa ifodalaganda docstrings deb nomlanuvchi o’ziga xosligi mavjud. Bu juda muhim instrument bo’lib siz undan albatta foydalanishingiz kerak. Sababi bu sizning dasturingizni yaxshi xujjatlash(документировать) va oson tushunishga yordam beradi. Xujjatlash satrini dastur bajarilish jarayonida funksiyadan olish mumkin.

 

Misol: (func_doc.py nomi bilan saqlang)

 

  1. def printMax(x, y):
  2.  
  3.     """Ikki sondan kattasini chop etadi.
  4.  
  5.     Ikkala qiymat ham butun son bo'lishi kerak."""
  6.  
  7.  
  8.  
  9.     x = int(x) # agar iloji bo’lsa, butun songa konvertatsiya qilamiz
  10.  
  11.     y = int(y)
  12.  
  13.  
  14.     if x > y :
  15.  
  16.         print(x, 'katta')
  17.  
  18.     else:
  19.  
  20.         print(y, 'katta')
  21.  
  22.  
  23.  
  24. printMax(3, 5)
  25.  
  26. print(printMax.doc)

 

 

Natija:

  1. $ python func_doc.py
  2. 5 katta
  3. Ikki sondan kattasini chop etadi.
  4. Ikkala qiymat ham butun son bo'lishi kerak.

Bu qanday ishlaydi:

Birinchi mantiqiy qatordagi satr funksiya uchun docstring hisoblanadi. Docstiring modul va klasslar bilan ham qo’llaniladi.

Funksiya docstiringini ko’p qatorli satr ko’rinishida yozish qabul qilingan. Bu satrning birinchi qatori bosh xarf bilan boshlanadi va nuqta bilan tugaydi. Ikkinchi qator bo’sh qoldiriladi va funksiya haqidagi to’liq ma’lumot uchunchi qatordan boshlab yoziladi.

Shunday  uslubda docstring yozish tavsiya qilinadi.

printMax funksiyasining docstringiga shu funksiyaning __doc__ atributi orqali murojat qilish mumkin (Ikkita belgilash simvoliga e’tibor bering). Shuni e’tiborga olingki, python “hamma” narsani ob’yekt ko’rinishida tasavvur qiladi.

 

Agar siz Pythonda help() funksiyasini ishlatgan bo’lsangiz, demak, siz docstringni ko’rgansiz. Bu funksiya tegishli funksiyaning doc atributini hisoblaydi va ifodali holda ekranga chop etadi. Buni yuqoridagi funksiya misolida ko’rishingiz mumkin.

help(printMax) kodini dastur kodiga qo’shing.

Biz funksiyalarning ko’p qirralarini ko’rib chiqdik, lekin bu hammasi emas. Ko’rib chiqqanlarimiz pythonda funksiyalar bilan ishlashda duch kelishingiz mumkin bo’lgan ko’p hollarni qamrab olgan.

(559 marta o'qilgan, bugun 1 marta o'qildi)

O'xshash maqolalar: