Bu nima?
Pythonʼdagi funksiyalar: nega kerak va qanday ishlatiladi?
Oʻzini hurmat qiladigan har bir Python dasturchining bazasi.
Pythonʼdagi funksiyalar (def) — kodning maʼlum operatsiyalarni bajaradigan va natija beradigan qismi. Uni bir marta yozib, butun dasturda qayta foydalanish mumkin. Maqolada Pythonʼdagi funksiyalar qanday ishlashi, boshqa jarayonlardan qanday farq qilishi va argumentlar nega kerakligi haqida soʻz yuritamiz.
Funksiya sintaksisi
Boshqa dasturlash tillarida boʻlgani kabi Pythonʼda ham funksiyalarni yaratish uchun maxsus qoidalar mavjud. Ularga rioya qilinmasa, interpretator kodni toʻgʻri qayta ishlay olmaydi va katta ehtimol bilan xatolik yuz beradi.
Funksiyani belgilash uchun def (inglizcha define — aniqlash, belgilash) kalit soʻzidan foydalaniladi. Umuman olganda, bu quyidagicha koʻrinishga ega boʻladi:
def funksiya_nomi (argumentlar):
funksiya_tanasi
return natija
Bu yerda:
funksiya_nomi — kodda funksiyani chaqirish uchun kerakli boʻlgan nom;
argumentlar — funksiya kirish uchun qabul qiladigan qiymatlar. Bu maydon boʻsh boʻlishi mumkin;
funksiya_tanasi — chaqirilganda bajariladigan koʻrsatmalar toʻplami;
natija — funksiya ishni yakunlagach qaytaradigan qiymatlar.
Formatlash qoidalari, shu jumladan, qavslar, satr boshi va ikki nuqtalarga rioya qilish muhimdir. Aks holda, dastur xato natija qaytaradi.
Misol tariqasida ikki raqamning yigʻindisini topib, hisoblash natijasini qaytaradigan funksiyani koʻrib chiqamiz:
def sum(a, b):
return a + b
Funksiya qanday chaqiriladi?
Pythonʼda funksiyani bir marta yaratish va keyin kodda cheksiz chaqirish mumkin. Bu vaqtni tejaydi va loyihadagi satrlar sonini kamaytiradi.
Funksiyani chaqirish uchun uning nomini kiritish va argumentlarni qavslar ichida koʻrsatish kerak. Umumiy holda chaqiruv sintaksisi quyidagicha koʻrinishda boʻladi:
funksiya_nomi (argumentlar)
Endi biz ilgariroq yaratgan yigʻindini topish funksiyasini chaqiramiz. Buning uchun sum nomini kiritamiz, qavs ichida a va b oʻzgaruvchilarini koʻrsatamiz:
c = sum(a, b)
Endi murakkabroq misolni koʻrib chiqamiz. Tasavvur qilaylik, EGEʼning (yagona davlat imtihoni) turli fanlar boʻyicha natijani hisoblab, talabaning imtihonni qanchalik yaxshi topshirganini koʻrsatadigan dastur yozmoqchimiz.
# EGE natijalarini soʻraymiz
math = int(input())
russian = int(input())
informatics = int(input())
# EGE natijalarini qabul qiladigan, summani hisoblaydigan va natijani qaytaradigan funksiyani kiritamiz
def passed (math, russian, informatics):
total = math + russian + informatics
if 120 <= total < 210:
print('Yaxshi')
elif 210 <= total < 240:
print('Juda yaxshi')
elif total >= 240:
print(''Aʼlo')
else:
print('Qoniqarsiz')
return total
# Funksiyani chaqiramiz va natijani chiqaramiz
print(passed(math, russian, informatics))
# Natija:
40
80
80
Yaxshi
200
Funksiyalarning qamrov sohasi
Pythonʼda qamrov sohasi funksiya ichida qaysi oʻzgaruvchilardan qayerda foydalanish mumkinligini belgilab beradi. Oʻzgaruvchilarning bir nechta turi mavjud.
Lokal soha (local scope)
Funksiya ichida oraliq hisoblashda yordam beradigan vaqtinchalik oʻzgaruvchilarni belgilash mumkin. Ular faqat funksiya tanasida mavjud boʻlib, loyihaning boshqa joylarida ulardan foydalanib boʻlmaydi. Mana shu lokal qamrov sohasi hisoblanadi.
Quyidagi misolda c oʻzgaruvchisi sum funksiyasi ichida belgilangan. Undan faqat funksiya ichida foydalanish mumkin, agar boshqa joyda ishlatishga harakat qilinsa, Python xatoga yoʻl qoʻyadi:
def sum(a, b):
c = a + b
return c
Keng qamrovli funksiya sohasi (enclosing function scope)
Matryoshka kabi bir-birining ichiga joylashtirilgan ichma-ich funksiyalar ham mavjud. Bunday holda ichki funksiya tashqi funksiyada belgilangan oʻzgaruvchilardan foydalanish huquqiga ega boʻladi. Bu qoida teskarisiga ishlamaydi.
Funksiya chaqiruvlari sonini aniqlaydigan hisoblagich kodini yozamiz. Buning uchun ichma-ich arxitekturadan foydalanamiz:
def make_counter():
# Keng qamrovli funksiyada count oʻzgaruvchisini belgilaymiz
count = 0
def counter():
# count keng qamrovli funksiyada ekanini yozamiz
nonlocal count
count += 1
return count
return counter
# Hisoblagichni yaratamiz
call_counter = make_counter()
# Hisoblagichdan foydalanishga misol
print(call_counter()) # Natija: 1
print(call_counter()) # Natija: 2
print(call_counter()) # Natija: 3
Bu misolda ichma-ich funksiyani hisoblash uchun count oʻzgaruvchisidan foydalaniladi. Dastur oʻzgaruvchini yuqoridagi misolda boʻlgani kabi lokal deb hisoblamasligi uchun nonlocal kalit soʻzi qoʻllanadi. Bu joriy misolimizda boʻlgani kabi oʻzgaruvchi qiymatini faqat ichki funksiyada yangilamoqchi boʻlganimizda foyda beradi.
Global soha (global scope)
Funksiyalar tashqarisida belgilangan oʻzgaruvchilar global sohada joylashgan hisoblanadi. Bu esa ular butun dasturda koʻrinishi va barcha funksiyalardan foydalanish mumkinligini anglatadi. Agar funksiya ichidagi global funksiyaning qiymatini oʻzgartirish kerak boʻlsa, global kalit soʻzi ishlatiladi.
Masalan, konditer mahsulotlari sotadigan doʻkon uchun tayyorlangan tortlar hisobini yuritadigan dasturni yozishimiz kerak. Har safar yangi tortlarni sotganimizda cake oʻzgaruvchisini oʻzgartiramiz:
# Tayyorlangan tortlar sonini bildiruvchi global oʻzgaruvchi
cake_count = 10
def modify_cake():
global cake_count
# Global oʻzgaruvchining qiymatini oʻzgartiramiz
cake_count = 15
modify_cake()
print(modify_cake) # Natija: 15
Funksiya argumentlari
Pythonʼda funksiyalar har xil turdagi argumentlar bilan ishlashi mumkin. Bu tilni moslashuvchan qilib, turli vazifalar bajarish imkonini beradi.
Pozitsion
Bu tur eng koʻp uchraydi. “Tarix”, “Adabiyot”, “Dasturlash” kabi turli boʻlimlar mavjud boʻlgan kitob doʻkonini tasavvur qiling. Xodimlar yangi kitoblarni tegishli boʻlimlarga joylashtiradi. Shu tarzda kerakli kitobni topish osonroq boʻladi.
Bu yerda ham shunday: qiymatlar funksiyaga unda koʻrsatilgan tartibda uzatiladi. Aks holda, xato yuzaga keladi. Agar funksiya bir nechta argumentlarni qabul qilsa, vergul bilan ularni ajratish kerak:
# Funksiya quyidagi tartibda ikki argumentni qabul qiladi: boʻlim va kitobdef search (section, book): print ('kitobingiz: ', section, book) # Maʼlumotlarni ham xuddi shu tartibda uzatamiz search ('Tarix', 'Rossiya davlati tarixi')
Nomlanganlar
Funksiyani chaqirishda parametr nomlaridan foydalanilganda argumentlarni tasodifiy tartibda uzatish mumkin.
# Funksiya ikkita argumentni quyidagi tartibda qabul qiladi: boʻlim va kitob
def search(section, book):
print('Kitobingiz: ', section, book)
# Maʼlumotlarni ham ayni tartibda uzatamiz
search('Tarix','Rossiya davlati tarixi')
Oʻzgaruvchan uzunlik argumentlari (*args va **kwargs)
Python nechta argumentni qabul qilishi kerakligini bilmasak ham funksiyalarni aniqlash imkonini beradi:
*args nechta pozitsion argumentimiz borligi nomaʼlum boʻlganda ishlatiladi. args oldidagi yulduzcha * funksiya chaqirilganda uzatilgan barcha pozitsion argumentlar tuple kortejiga toʻplanishi va unga args tayinlanishi kerakligini bildiradi.
**kwargs esa nechta nomlangan argumentimiz borligini bilganimizda ularni lugʻat (dictionary) shaklida uzatish uchun ishlatiladi. kwargs oldidagi ikkita yulduzcha (**) barcha nomlangan argumentlar lugʻatga toʻplanishi va kwargs tayinlanishi kerakligini anglatadi.
Masalan, *args va **kwargs yordamida odamlar bilan ismlari va kayfiyat haqidagi qoʻshimcha maʼlumotlardan foydalanib salomlashadigan greet funksiyasini yaratamiz.
def greet(greeting, *args, **kwargs):
for name in args:
message = f'{greeting}, {name}!'
if 'mood' in kwargs:
message += f 'Oʻzingni {kwargs['mood']} his qilyapsan.'
print(message)
# Oʻrnak
greet('Salom', 'Katya', 'Lena', 'Vika', mood= 'vaqtichogʻ')
greet('Salom', 'Sasha', 'Tanya')
greet funksiyasi salomlashish, *args nomlar roʻyxati va **kwargsʼning qoʻshimcha parametrlarini qabul qiladi. argsʼdagi har bir nom orqali oʻtadi va salomlashish xabarini shakllantiradi. Agar kwargsʼda mood kaliti boʻlsa, xabarga kayfiyat haqida maʼlumot qoʻshiladi.
Ixtiyoriy argumentlar (dastlabki holatdagi parametrlar)
Baʼzan funksiyalarda dastlabki holatdagi qiymatlar oʻrnatiladi. Funksiya ulardan boshqa argumentdan foydalanish kerakligi koʻrsatilmagan holatlarda foydalanadi.
Masalan, agar kitob doʻkoni onlayn ilova shaklida boʻlganida har bir tashrif buyuruvchi bir xil qutlov xabarini oladi. Ammo avtorizatsiyadan oʻtgan foydalanuvchilar, yaʼni oʻz maʼlumotlarini doʻkonga topshirganlarga shaxsiy qutlov keladi.
def greet(name = 'Tashrif buyuruvchi', message = 'Salom, '):
print(message, name)
# Funksiyani dastlabki holatdagi qiymatni koʻrsatmasdan chaqirish
greet() # Natija: Salom, Tashrif buyuruvchi
# Dastlabki holat qiymati oʻzgartirilgan funksiyani chaqirish
greet('Artyom') # Natija: Salom, Artyom
Bu misolda greet funksiyasi ikkita argument: name va messageʼni oladi. Message argumentining dastlabki holatdagi qiymati Salom, nameʼda esa — tashrif buyuruvchi. Agar funksiya chaqirilganda qiymat koʻrsatilmagan boʻlsa, dastlabki holatdagisi ishlatiladi.
Qiymat va havola orqali uzatish
Pythonʼda yangi ish boshlayotganlarni tashvishga soladigan keng tarqalgan savollardan biri — oʻzgaruvchilar funksiya va metodlarga qanday yetkazilishi: qiymat yoki havola orqali?
Qiymat orqali — funksiyaga oʻzgaruvchining oʻzi emas, balki uning qiymati nusxasi uzatilganda. Demak, funksiyani chaqirganda bu argumentga oʻzgartirish kiritsangiz, asl oʻzgaruvchiga taʼsir qilmaydi.
Havola orqali — funksiyaga oʻzgaruvchini oʻz ichiga olgan xotiradagi obyektga havola uzatiladi va funksiya ichida ushbu argumentga kiritilgan har qanday oʻzgarishlar asl oʻzgaruvchida aks etadi.
Pythonʼda argumentlar har doim havola orqali uzatiladi, lekin oʻzgarmas maʼlumotlar turi, masalan, son yoki satrlar uchun qiymat orqali uzatishdan foydalanish mumkin. Chunki funksiya ichidagi obyektni oʻzgartira olmaysiz.
Roʻyxat yoki lugʻatlar kabi oʻzgaruvchan maʼlumotlar turi uchun funksiya ichida kiritilgan oʻzgarishlar asl obyektda aks etadi.
Misol:
def add_item(my_list, item):
# Uzatilgan roʻyxatni oʻzgartiramiz
my_list.append(item)
numbers = [1, 2, 3]
add_item(numbers, 4)
print(numbers) # Natija: [1, 2, 3, 4]
Koʻrinib turibdiki, roʻyxatni argument sifatida olganimizda unga oʻzgartirish kiritdik va u boshqacha koʻrinishga ega boʻldi.
Argumentlar sifatida lugʻat
Lugʻat (**kwargs) yordamida ixtiyoriy miqdordagi nomlangan argumentlarni uzatish mumkin.
Masalan, oʻzgaruvchidan onlayn doʻkonning har bir foydalanuvchisi uchun shaxsiy maʼlumotlarni chiqarishda foydalanish mumkin. Kimningdir toʻliq ism-sharifi, yoshi va yashash joyi toʻldirilgan boʻladi. Kimdir yashash joyini koʻrsatishga eringan boʻladi — bu holda faqat mavjud maʼlumotlarni chiqarish mumkin.
def print_person_info(**kwargs):
print(f'Ismi-sharifi: {kwargs.get('name')}')
print(f'Yoshi: {kwargs.get('age')}')
# Lugʻatni nomlangan argumentlar sifatida uzatish
person_1 = {'name': 'Anya', 'age': 10}
person_2 = {'name': 'Boris'}
person_3 = {'age': 12}
person_4 = {}
print_person_info(**person_1)
Qaytariladigan qiymatlar (return)
Pythonʼda return kalit soʻzi funksiyadan qiymatni qaytarish uchun ishlatiladi. Olingan qiymatdan keyinchalik dasturda foydalanish mumkin.
Quyidagi misolda add funksiyasi ikkita: a va b argumentlarni qabul qiladi, qoʻshadi va return yordamida a + b yigʻindisini qaytaradi:
def add(a, b):
return a + b
result = add(3, 5)
print(result) # Natija: 8
Agar funksiyada return kalit soʻzi ishlatilmasa, dastlabki holatdagi Noneʼni qaytaradi.
Lambda funksiyalar
Lambda funksiyalar — bitta kod satrida tayinlanishi mumkin boʻlgan nomsiz funksiyalar. Yuqorida funksiya nomi uni qayta chaqirish uchun ishlatilishini aytib oʻtgandik. Lambda funksiyani qayta ishlatib boʻlmaydi — uning chaqirish mumkin boʻlgan nomi yoʻq. Ular odatda kichik funksiyani argument sifatida uzatish kerak boʻlgan joyda ishlatiladi.
Lambda funksiyalarni tayinlash uchun kalit soʻzi lambdaʼdan foydalaniladi. Undan keyin parametrlar kiritiladi va ikki nuqtadan soʻng funksiya qaytaradigan natija ifodasi koʻrsatiladi. Umuman olganda, bu shunday koʻrinishga ega boʻladi:
lambda argumentlar: ifoda
Misol tariqasida sonning juftligini tekshirib, True yoki Falseʼni chiqaradigan lambda funksiyani koʻrib chiqamiz. Parametr sifatida num oʻzgaruvchisi uzatiladi va ikki nuqtadan keyin num % 2 == 0 ifodasi koʻrsatiladi:
is_even = lambda num: num % 2 == 0
print(is_even(4)) # Natija: True
print(is_even(7)) # Natija: False
Jarayon va funksiyalar orasidagi farqlar
“Jarayon” va “funksiya” Pythonʼda koʻpincha bir xil narsa: maʼlum bir vazifani bajarish uchun kod blokini anglatadi. Ammo ular orasida farq mavjud.
Jarayon — kodning maʼlum bir vazifa yoki amalni bajaradigan, lekin hech narsa qaytarmaydigan qismi. U argumentlarni qabul qilishi, operatsiyalarni bajarishi va dastur holatini oʻzgartirishi mumkin. Yoki ayrim harakatlarni qiymatni aniq qaytarmasdan bajara oladi.
Masalan, yuqoridagi misollarda keltirilgan greet nomni argument sifatida qabul qilib, ekranga salomlashishni olib chiqadigan jarayondir. U hech qanday qiymatni qaytarmaydi: uning maqsadi faqat harakatni bajarishdir.
Funksiya ham kodning maʼlum bir vazifa yoki harakatni bajaradigan bir qismi. Ammo u return kalit soʻzi yordamida natijani qaytaradi.
Pythonʼda jarayon va funksiyalar oʻrtasida qatʼiy farq yoʻq. Kodda ular bir xil def kalit soʻzi bilan belgilanadi.
Xulosa
Pythonʼda funksiyalar def kalit soʻzi bilan tayinlanadi, soʻngra funksiya nomi, argumentlar uchun qavslar va ikki nuqta keladi. Funksiya tanasi satr boshidan yoziladi.
Python funksiyalarda bir nechta turdagi argumentlarni, shu jumladan, pozitsion, nomlangan, dastlabki holatdagi qiymatga ega argumentlar, *args va **kwargs yordamida oʻzgaruvchan miqdordagi argumentlarni qoʻllab-quvvatlaydi.
Lokal oʻzgaruvchilar faqat funksiya ichida koʻrinadi. Global oʻzgaruvchilar butun kodda mavjud. Ichki funksiyalar esa bir-birining oʻzgaruvchilaridan foydalanish huquqiga ega.
Funksiyalar return kalit soʻzi yordamida qiymatlarni qaytarishi mumkin. U boʻlmagan taqdirda funksiya Noneʼni qaytaradi.
Python lambda kalit soʻzi yordamida standart funksiyalardan tashqari anonim funksiyalarni ham yaratish imkonini beradi va ular faqat bitta ifodadan iborat boʻlishi mumkin.
Pythonʼda funksiya va jarayonlar oʻrtasida yaqqol farq yoʻq.