#24 FUNKSIYALAR. SON'GSO'Z.
Funksiyalar mavzusiga yakun yasaymiz.
lambda
YOHUD NOMSIZ FUNKSIYA
lambda
YOHUD NOMSIZ FUNKSIYAPythonning o'ziga xos xususiyatlaridan biri, nomsiz vaqtinchalik funksiyalar yaratish imkoniyati. Bunday funksiyalarni yaratishda def
operatori o'rniga lambda
operatori ishlatilgani uchun ham lambda
funskiyalar deb ataladi.
Nomsiz funksiyalar quyidagicha yaratiladi:
Lambda funksiyalari istalgan miqdordagi argumentlarga ega bo'lishi mumkin, ammo funksiya badanida faqat bitta ifoda mavjud bo'ladi. Ifoda bajariladi va qaytariladi (return
operatori shart emas).
Nomsiz funksiyalar biror ifodani tezda hisoblab olishda qulay. Misol uchun quyidgai lambda funksiya ikkita argument qabul qiladi ( ), va aylana uzunligini qaytaradi:
Natija: 62.83185307179586
Kodni tahlil qilamiz, 1-qatorda math modulini chaqirib oldik. 2-qatorda lambda funksiyani yaratdik, funksiyamiz pi
va r
argumentlarini qabul qilib, 2*pi*r
qiymatni qaytaradi. Funksiyaga nom bermadik, lekin unga uzunlik
identifikatori orqali murojat qilishimiz mumkin. 3-qatorda funksiyamizga murojat qildik va natijani konsolga chiqardik.
Yana bir misol, topingchi quyidagi funksiyaning vazfiasi nima?
Shu yerda so'rashingiz mumkin, nima uchun lambda nomsiz deb ataladi, ahir unga hozirgina nomi bilan murojat qildikku?
Gap shundaki, lambda finksiyalarning asl mohiyati boshqa funskiyalar bilan birga ishlaganda ko'rinadi. Keling, tushunarli bo'lishi uchun oddiyroq misol ko'ramiz.
Quyidagi dasturda biz avval daraja degan funksiya yasadik, bu funskiyamiz n degan o'zgaruvchi qabul qilib oladi va funksiya ichidagi noma'lum x ning n-darajasini qaytaradi. Aslida daraja
bu funksiya yasaydigan funksya bo'ldi. Xo'sh, undan qanday foydalanamiz? 4-5-qatorlarda esa daraja funksiyasidan yana 2 ta funksiya yasadik: kvadrat - kiritilgan sonning kvadratini hisoblaydi, kub - kiritilgan sonning kubini hisoblaydi.
Natija: 3-ning kvadrati 9 ga, kubi 27 ga teng
Lambda funksiyalaridan argument sifatida boshqa funksyani qabul qiluvchi funksiyalar bilan ishlashda ham keng foydalaniladi. Misol uchun map()
va filter()
funksiyalari.
map()
FUNKSIYASI
map()
FUNKSIYASIBu funksiya argument sifatida ro'yxat (yoki lug'at) va boshqa bir funksiyani qabul qilib, ro'yxat elementlariga qabul qilingan funksya yordamida ishlov beradi. Tushunarli bo'lish uchun quyidagi misolni ko'ramiz.
Yuqoridagi misolda avval 0 dan 10 gacha sonlar
ro'yxatini tuzib oldik, keyin esa map
funksiyasiga ro'yxat va sqrt
funksiyasini uzatib, ro'yxatdagi barcha sonlarning ildizini hisoblab oldik.
map() funksiyasi map obyekt qaytargani sababli, qaytgan obyektni ro'yxatga o'tkazib olish uchun list() funksiyasidan foyydalandik.
Yana bir misol ko'ramiz:
Natija: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Yuqoridagi misolda biz avval berilgan sonning kvadratini hisoblovchi funksiya yaratib oldik, undan keyin esa map yordamida sonlar ro'yxatidagi elementlarning kvadratini ham hisoblab oldik.
Endi keling huddi shu misolni lambda yordamida yozamiz:
Natija: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Yuqoridagi misolda, endi daraja degan funksiyani yaratib o'tirmasdan, to'g'ridan-to'g'ri map() ni ichiga darajani hisoblovchi lambda funksiya uzatdik.
map()
funksiyasi bo'lmaganida biz bunday dasturlarni for
yordamida yozishimiz kerak bo'lar edi:
map()
funksiyasiga bir nechta ro'yxatlar ham uzatish mumkin:
Natija: [11, 13, 15]
map()
istalgan ko'rinishdagi ma'lumot turlari bilan ishlaydi:
Natija: ['HASAN', 'HUSAN', 'OLIM', 'UMID']
filter()
FUNKSIYASI
filter()
FUNKSIYASIBu funksiya ham argument sifatida ro'yxat va boshqa funskiyani qabul qilib oladi va berilgan ro'yxat elementlarini berilgan funksiya yordamida saralaydi. Bunda argument sifatida uzatilgan funksiya mantiqiy qiymat qaytarishi kerak (True
yoki False
).
Keling bunga ham bir misol ko'ramiz: tasodifiy sonlar ro'yxatidan juft sonalrni ajratib oluvchi dastur yozamiz. Dasturimiz 3 qismdan iborat:
Avvalo,
random
modulidagisample()
funksiyasi yordamida 0-99 oralig'idagi 10 ta tasodifiy sonlar ro'yxatini tuzib oldikBerilgan son juft (True) yoki juft emas (False) ekanligini qaytaruvchi funksiya yozdik
filter() fuksiyasiga yangi yaratgan juftmi funksiyasi va tasodifiy sonlar ro'yxatini uzatib, yangi juft_sonlar ro'yxatini shakllantridik
Keling endi shu dasturni lambda yordamida yozamiz:
Kurib turganingizdek, lambda funksiya yordamida dastur bir muncha qisqaroq chiqadi. Agar juftmi
funksiyasi kelajakda shart bo'lmasa, alohida funksiya yaratib o'tirmasdan, bir marttalik lambda funksiyasidan foydalangan afzal.
Keling endi filter()
funksiyasi yordamida matnlarni saralashga ham misollar ko'raylik.
Quyidagi dastur mevalar
ro'yxatidan b
harfiga boshlanuvchi mevalarni ajratib oladi. Bu yerda biz matnlarga tegishli bo'lgan .startswith()
metodidan foydalandik. Bu metod, berilgan matn shu harfdan boshlanadimi yoki yo'q tekshiradi va True
yoki False
qiymat qaytaradi.
Quyidagi dastur esa mevalar
ro'yxatidan nomi 5 yoki undan kam harfdan iborat mevalarni saralab oladi.
Natija: ['olma', 'anor', 'anjir', "o'rik", 'qovun', 'banan']
Topingchi, quyidagi kod qanday vazifani bajaradi?
SO'NGSO'Z
Ushbu darsimiz bilan biz dasturlash asoslarining katta bir qismiga yakun yasadik, navbat Object Oriented Programming va boshqa katta mavzularga. Lekin, bu mavzularga o'tishdan avval, keyingi darslarimizni bir nechta sodda loyihalar qilishga bag'ishlaymiz.
E'tiboringiz uchun rahmat!
Last updated