Skip to content

Funksiyalar

Funksiya - kodlar bloki bo'lib chaqirilganda ishga tushadi. Aniqroq qiladigan bo'lsak bir xil takrorlanadigan jarayonlarni qulay qilish uchun, takrorlanadigan qismlar funksiya bloki ichida yoziladi va kerakli joyda foydalaniladi. Funksiyalar qiymat qaytarishi yoki qaytarmasligi mumkin.

Pythonda funksiyalar.

Python'da funksiyalarni e'lon qilish uchun def kalit so'zidan foydalaniladi.

1-misol.

def funksiya():
    print("Assalomu alaykum, Men funksiyaman!")

Bu yerda:

  • def funksiyani e'lon qilish uchun kalit so'z
  • funksiya funksiya nomi. Bu nomni dasturchini o'zi istalgan nom bilan nomlashi mumkin. Yagona sharti Python'da identifikatorlarni nomlash shartlari mos kelishi kerak.
  • () funksiya nomidan keyin qavslarni ochish, yopish va : qo'yish majburiy bu funksiya e'lon qilish yakunlanganini anglatadi.
  • print("Assalomu alaykum, Men funksiyaman!") bu qism funksiyani tana qismida yozilgan bo'lib, bu qismda boshqa mantiqiy amallar yozish mumkin.

Funksiyani chaqirish.

Yuqorida funksiya qanday e'lon qilishini ko'rib chiqdik endi esa shu funksiyadan qanday foydalanishni ko'ramiz.

Funksiyadan

2-misol.

# funksiani e'lon qilish
def funksiya():
    print("Assalomu alaykum, Men funksiyaman!")

# funksiyani chaqirish
funksiya()

Natija:

Assalomu alaykum, Men funksiyaman!

Funksiyani chaqirish uchun funksiya nomini yozish va nomidan keyin () qavslarni ochish va yopish kerak bo'ladi. Bunga misol qilib o'tgan mavzuda lug'atlar bilan ishlashda foydalangan clear() funksiyasini olishimiz mumkin. Agar eslay olmasangiz lug'atlar mavzusini qayta ko'rib chiqing.

Funksiyaga qiymat berish(arguments)

Shunday holatlar bo'ladi funksia biror berilgan qiymat ustida mantiqiy amallarini bajarishi, bu holatlarda funksiyaga qaysi qiymat ustida ishlashni aytish zarur buni funksiyaga qiymat berish orqali amalga oshirish mumkin. Funksiyaga berilgan qiymatlar bir yoki undan ko'p bo'lishi mumkin har bir qiymat o'z nomiga ega bo'ladi va , bilan ajratiladi.

3-misol.

# funksiani e'lon qilish
def funksiya(ism):
    print(f"Assalomu alaykum, {ism}!")

# funksiyani chaqirish
funksiya("Farrux")
funksiya("Dilshod")
funksiya("John")

Natija:

Assalomu alaykum, Farrux!
Assalomu alaykum, Dilshod!
Assalomu alaykum, John!

Yuqoridagi misolda ism funksiyaga berilgan qiymat nomi. E'tibor bergan bo'lsangiz 3 marta funksiya chaqirildi va har xil qiymat berildi.

Info

Python hujjatlarida argumentlar(arguments) qisqartirilib args deyiladi.

Info

Parameters yoki Arguments? Ikkalasini bir xil narsa uchun ishlatish mumkin ya'ni funksiyaga uzatiladigan ma'lumot.

Funksiyaga bir nechta argument berish

Funksiya argumentlari soni nechta bo'lsa, funksiya chaqirilganda barcha argumentlarga qiymatlarni berish berish kerak bo'ladi.

4-misol.

def funksiya(ism, familya):
    print(f"Assalomu alaykum, {ism} {familya}!")

funksiya("Farrux", "Elomonov")

Natija:

Assalomu alaykum, Farrux Elomonov!

Agar bu funksiyaga bitta argumentni bersak nima bo'ladi?

5-misol.

def funksiya(ism, familya):
    print(f"Assalomu alaykum, {ism} {familya}!")

funksiya("Farrux Elomonov")

Natija:

TypeError: funksiya() missing 1 required positional argument: 'familya'

Agarda sizda biror funksiya bo'lsa, lekin unga beriladigan argumentlar soni aniq bo'lmasa * bilan argumentni e'lon qilish kerak. * bilan berilgan qiymatlar tuple turida qabul qilinadi. Bunday argument berish uchun argument nomidan oldin * belgisi qo'yish kifoya.

6-misol.

def funksiya(*args):
    print(args)

funksiya("Farrux", "Elomonov")

Natija:

('Farrux', 'Elomonov')

Bu qiymatlar ustida biror amallarni bajarish tuple toifasi bilan bir xilda amalga oshiriladi. args ga indexlar bilan murojaat qilish mumkin yoki sikl operatorlari yordamida ishlash mumkin.

Argument kalit so'zi

Biz argumentlarga o'zimiz nom berdik, nomlashda argument oladigan qiymatni vazifasiga qarab nomlash maqsadga muvofiq bo'ladi chunki undan foydalanish davomida tushunarsiz xohlatlar kamroq bo'ladi. Python'da funksiya argumentlariga qiymat berishimizda aynan qaysi argumentga qiymat berayotganimizni belgilab ketishimiz mumkin. Agar biz aytib ketmasak Python'ning o'zi argument va berilgan qiymatlarni tartibiga qarab avtomat joylashtirib ketadi.

7-misol.

def funksiya(ism, familya):
    print(f"Assalomu alaykum, {ism} {familya}!")

funksiya("Farrux", "Elomonov")

Natija:

Assalomu alaykum, Farrux Elomonov!

Yuqoridagi misolda qiymatlarni berdik funksiyani o'zi tartibi bilan joylashtirdi, agar biz tartibini o'zgartirsak natija biz kutgandek chiqmaydi chunki ism o'rniga familya to'g'ri keladi. Bunday holatlarda aniq qaysi argumentga qiymat berayotganimizni keltirib o'tishimiz mumkin.

8-misol.

def funksiya(ism, familya):
    print(f"Assalomu alaykum, {ism} {familya}!")

funksiya(ism = "Farrux", familya = "Elomonov")

Natija:

Assalomu alaykum, Farrux Elomonov!

Agar o'rnini almashtirsak ham natija bir xil.

9-misol.

def funksiya(ism, familya):
    print(f"Assalomu alaykum, {ism} {familya}!")

funksiya(familya = "Farrux", ism = "Elomonov")

Natija:

Assalomu alaykum, Farrux Elomonov!

Boshlang'ich qiymat(default)

Agar parametrli funksiya e'lon qilib undan foydalanmoqchi bo'lsangiz barcha argumentlarni kiritishni so'raydi, siz yechayotgan muamoda har doim ba'zi argumentlardan foydalanish shart bo'lmasa ularga boshlang'ich qiymat berishingiz mumkin. Quyida misol bilan ko'ramiz.

10-misol.

def funksiya(ism, familya, sharif = None):
    if sharif:
        print(f"Assalomu alaykum, {ism} {familya} {sharif}!")
    else:
        print(f"Assalomu alaykum, {ism} {familya}!")

funksiya(familya = "Farrux", ism = "Elomonov")

Natija:

Assalomu alaykum, Farrux Elomonov!

Biz boshlang'ich qiymat None berdik. Agar shrif parametiriga qiymat berilmasa boshlang'ich qiymat sifatida None olinadi. Boshlang'ich qiymatni sizni holatingizga qarab tanlashingiz mumkin.

11-misol.

def funksiya(ism, familya, sharif = None):
    if sharif:
        print(f"Assalomu alaykum, {ism} {familya} {sharif}!")
    else:
        print(f"Assalomu alaykum, {ism} {familya}!")

funksiya(familya = "Farrux", ism = "Elomonov", sharif = "Baxtiyor o'g'li")

Natija:

Assalomu alaykum, Farrux Elomonov Baxtiyor o'g'li!

Kalitli argument

Argumentlarni berishda tuple va oddiy nom ko'rinishida berishni ko'rib chiqdik, endi bizda yana bir yo'li mavjud bo'lib bu yo'l bilan kalit-qiymat ko'rinishda beriladi, ya'ni dictionary(lug'at) ko'rinishda beriladi. Agar siz lug'atlar mavzusini yaxshi o'rgangan bo'lsangiz sizga qiyinchilik tug'dirmaydi.

Kalit-qiymatli parametr berish uchun argument nomidan oldin ** belgilarini qo'yish kifoya qiladi.

Info

Python hujjatlarida kalit-qiymat parametrlar kwargs deb nomlanadi. Barchaga shunday nomalsh tavfsiya qilinadi.

12-misol.

def funksiya(**kwargs):
    print(f"Assalomu alaykum, {kwargs['ism']} {kwargs['familya']}!")

funksiya(familya = "Farrux", ism = "Elomonov")

Natija:

Assalomu alaykum, Farrux Elomonov Baxtiyor o'g'li!

Bu yerda kwargs kalit-qiymat kutadi qiymatlar berilganidan so'ng lug'at hosil qiladi, aniqroq aytilganda kwargs turi dict bo'ladi.

Qiymat qaytarish

Yuqoridagi misollarimizda biz funksiyani o'zi natija qaytarshini ko'rib chiqdik, funksiyalar faqat natijani chop qilish uchun emas biror mantiqiy amalni bararib uni qiymat sifatida qaytrishi ham mumkin. Quyida oddiy chop qilisha misol ko'ramiz.

13-misol

mevalar = ["nok", "olma", "anor"]

def chop_qil(royxat):
  for m in royxat:
    print(m.capitalize())

chop_qil(mevalar)

Natija:

Nok
Olma
Anor

Yuqoridagi misolda biz ro'yxat elementlarini bosh harflarda chop qildik. Bizda shunday holatlar bo'lishi mumkin chop qilish emas ro'yxat elementlarini bosh harflarga o'girib boshqa amal bajarish, buning uchun funksiyalarning qiymat qaytarish imkoniyatidan foydalanamiz.

Yuqoridagi misolni quyidagicha tartibda bajarib bajaramiz.

mevalar = ["nok", "olma", "anor"]

def chop_qil(royxat):
  yangi_royxat = [] # bosh harflar bilan saqlash uchun bo'sh ro'yxat oldindan elon qilindi.
  for m in royxat:
    yangi_royxat.append(m.capitalize()) # elementni yangi ro'yxatga qo'shadi.
  print(yangi_royxat) # yangi ro'yxat chop qilindi.
chop_qil(mevalar)

Natija:

['Nok', 'Olma', 'Anor']

Agar ro'yxatlar mavzusini yaxshi o'rangan bo'lsangiz nima sodir bo'lganini yaxshi tushundingiz.

Endi esa yangi tayyor bo'lgan ro'yxatni chop qilmaymiz uni funksiya bilan qiymat qilib qaytaramiz shunda funksiya shu ro'yxat qiymatiga ega bo'ladi. Buning uchun return kalit so'zidan foydalanamiz.

14-misol.

mevalar = ["nok", "olma", "anor"]

def chop_qil(royxat):
  yangi_royxat = [] # bosh harflar bilan saqlash uchun bo'sh ro'yxat oldindan elon qilindi.
  for m in royxat:
    yangi_royxat.append(m.capitalize()) # elementni yangi ro'yxatga qo'shadi.
  return yangi_royxat # yangi ro'yxat qiymati qaytarildi.
chop_qil(mevalar)

Natija:


Info

Natija chiqmaydi! Agar siz Python'ning interektive konsolidan yoki google colabdan foydalangan bo'lsangiz natija chiqishi mumkin. Lekin biror .py faylga saqlab dasturni ishga tushursangiz ekranga hech narsa chiqrilmaydi chunki biz natijani print() bilan chop qilmadik endi bu funksiya qiymatga teng.

Endi bu funksiya qaytargan natijani olishimiz uchun funksiyani o'zizni print() yordamida chop qilishimiz yoki biror o'zgaruvchiga o'zlashtirib usha o'zgaruvchi ustida amal bajarishimiz mumkin.

15-misol.

mevalar = ["nok", "olma", "anor"]

def chop_qil(royxat):
  yangi_royxat = [] # bosh harflar bilan saqlash uchun bo'sh ro'yxat oldindan elon qilindi.
  for m in royxat:
    yangi_royxat.append(m.capitalize()) # elementni yangi ro'yxatga qo'shadi.
  return yangi_royxat # yangi ro'yxat qiymati qaytarildi.
print(chop_qil(mevalar)) # funksiya o'zizni chop qilish
m = chop_qil(mevalar) # boshqa o'zgaruvchiga o'zlashtirish
print(m)

Natija:

['Nok', 'Olma', 'Anor']
['Nok', 'Olma', 'Anor']

16-misol.

def summa(a, b):
  return a + b

print(summa(5, 4))

Natija:

9

Ko'p qiymat qaytarish

Funksiya bir nechta qiymat qaytarishi ham mumkin, yuqoridagi misollarimizda bitta qiymat qaytrishni ko'rdik birdan ortiq qiymatlarni qaytarishni o'rganamiz.

16-misol.

def summa(a, b):
  return a + b, a * b, a - b

print(summa(5, 4))

Natija:

(9, 20, 1)

Natija tuple turida qaytadi.

Info

Funksiya barcha turdagi ma'lumotlarni qaytaradi.

Bo'sh funksiya

Funksiya e'lon qilinganidan so'ng bo'sh bo'lishi mumkin emas agar e'lon qilinib funksiya tanasi bo'sh bo'lsa xatolik sodir bo'ladi dastur ishga tushmaydi. Lekin shunday holatlar ham bo'lishi mumkin funksiyani bo'sh qoldirish kerak bo'ladi bunday holatda pass dan foydalanish kerak bo'ladi.

17-misol.

def summa(a, b):
  pass

print(summa(5, 4))

Natija:


Funksiya paramaetrlarini kalit yoki tartib bo'yicha berish

Funksiya parametrlari bilan ishlashda qiymatni qanday berish, parametr nomi bilan berish va funksiyani parametr nomisiz berganimizda o'zi tartibini aniqlashini ham o'rgandik. Endi o'rganadigan narsamiz bu tartibli argument yoki kalit qiymatli argument shuni belgilab qo'yishimiz mumkin bu bilan biz funksiyadan foydalanish davomida tushunmovshiliklarga olib kelishini oldini olamamiz.

Info

Agar siz faqat tartibi bilan funksiyaga parametr bermoqchi bo'lsangiz barcha parametrlarni e'lon qilingach oxirgi o'rinda / belgini e'lon qilishingiz kerak bo'ladi.

18-misol

def my_function(x, /):
  print(x)

my_function(3) 

Natija:

3

Endi funksiyadan quyidagicha foydalanib bo'lmaydi, agar shu tartibda foydalanlsa xatolik sodir bo'ladi.

19-misol

def my_function(x, /):
  print(x)

my_function(x=3) 

Natija:

TypeError: my_function() got some positional-only arguments passed as keyword arguments: 'x'

Info

Agar funksiya argumentlarini kalit qiymat bo'yicha qabul qilishni majburiy qilmoqchi bo'lsangiz barcha parametrlarni e'lon qilishdan oldin * belgisini e'lon qilishingiz kerak.

20-misol

def my_function(*, x):
  print(x)

my_function(x=3) 

Natija:

3

Agar kalit so'zsiz qiymat bersangiz quyidagi tartibda xatolik sodir bo'ladi.

21-misol

def my_function(*, x):
  print(x)

my_function(3) 

Natija:

TypeError: my_function() takes 0 positional arguments but 1 was given

Tartibli va kalit so'zli parametrlardan bir vaqtda ham foydalanish mumkin.

Info

Agar ikkalasidan bir vaqtda foydalanmoqchi bo'lsangiz, tartibli argumentlardan keyin / belgini va kalit so'zli argumentlardan oldin * belgini e'lon qilishingiz kerak bo'ladi.

22-misol

def my_function(a, b, /, *, c, d):
  print(a + b + c + d)

my_function(5, 6, c = 7, d = 8)

Natija:

26

Python'ning funksiyasini bu imkoniyatlaridan foydalanish har doim majburiy emas, dastur tuzish davomida uchragan muamoga qarab foydalanish zarur bo'ladi.

Rekursiya

Rekursiya — Funksiya oʻziga oʻzi toʻgʻridan-toʻgʻri yoki qandaydir vosita orqali murojaat qilish jarayoniga rekursiya deyiladi va bunday funksiya rekursiv funksiya deb ataladi.

Rekursiya haqida quyidagi havolalar orqali batafsil tanishib chiqishingz mumkin:

  • https://uz.wikipedia.org/wiki/Rekursiya
  • https://janobmusayev.medium.com/rekursiv-hikoya-6132b9480076
  • https://janobmusayev.medium.com/rekursiya-nima-uchun-u-kerak-eb8c552e14fe
  • https://www.texnoman.uz/post/rekursiya--hayotdan-misol-va-undan-unumli-foydalanish.html
  • https://staff.tiiame.uz/storage/users/850/presentations/wb5J4QV0JHs7bhXQrmjzwtd6S1bki4YbwHqdcQLf.pdf