Uploaded by Ozoda Mansurova

Oqim

advertisement
Oqim - bu elementlar ketma-ketligi. , map(), filter()va reduce()- funktsional
dasturlashning uchta asosiy vazifasi - siz elementlar ketma-ketligi ustida ishlashingiz
mumkin. Ushbu maqolada biz Java-da ular bilan ishlaganimiz kabi Python-da oqimlar
bilan qanday ishlashni o'rganamiz.
Lekin, avvalo, funktsional dasturlash haqida bir so'z aytaylik.
Funktsional dasturlash nima?
Funktsional dasturlash - bu muammoni alohida funktsiyalarga ajratadigan dasturlash
paradigmasi. Har bir funktsiya, agar iloji bo'lsa, kirish argumentlari to'plamini oladi
va natijani chiqaradi. Ushbu paradigmada biz imkon qadar o'zgaruvchan ma'lumotlar
turlaridan va holat o'zgarishlaridan qochamiz.
Shuningdek, u ro'yxatlarga, SOF FUNKTSIYALARGA va YUQORI DARAJADAGI
FUNKTSIYALARGA E'TIBOR QARATIB, LOOPLARGA EMAS,
BALKI REKURSIYAGA urg'u beradi .
Ushbu maqolada biz map(), filter()va reduce()Python-ni o'rganamiz. Bular funktsional
dasturlashda asosiy
bo'lgan XARITALASH , FILTRLASH va QISQARTIRISH operatsiyalarini bajarish
uchun ishlatiladigan Python usullari .
Birinchidan, shuni ta'kidlaymizki map(), filter(), va reduce()C tilida yozilgan va tezligi
va xotiradan foydalanish nuqtai nazaridan yuqori darajada optimallashtirilgan bo'lib,
ularni oddiy Python forsikliga qaraganda yaxshiroq tanlov qiladi.
Majburiy shart sifatida Pythonda funksiyalar haqida ma'lum ma'lumotlarga ega bo'lish
zarur. Agar sizga yangilanish kerak bo'lsa, PYTHON-DA FUNKTSIYANI QANDAY
ANIQLASH MUMKIN maqolasiga qarang .
Python da Streams ustida
ishlash: map()
map()argument sifatida funktsiyani va bir yoki bir nechta takrorlanuvchilarni oladi.
Chiqish o'zgartirilgan elementlarni qaytaradigan iteratordir.
Mana sintaksis:
map(function, iterable[, iterable1, iterable2,..., iterableN])
Ushbu birinchi argument map()transformatsiya funktsiyasi bo'lib, har bir asl element
yangisiga aylantiriladi. Bu har qanday Python bo'lishi mumkin.
Aytaylik, siz raqamli qiymatlar ro'yxatini olishingiz va uni asl ro'yxatdagi har bir
raqamning kub qiymatini o'z ichiga olgan ro'yxatga aylantirishingiz kerak. Siz
tsikldan foydalanishingiz forva shunga o'xshash kodni ishlatishingiz mumkin:
>>> # Define numbers to transform and an empty cube list
>>> num = [2, 3, 6, 9, 10]
>>> cube = []
>>> # Define for loop to transform the numbers
>>> for n in num:
...
cube.append(n ** 3)
>>> # Compute cube of num
>>> cube
[8, 27, 216, 729, 1000]
Ushbu tsikl kub qiymatlari ro'yxatini qaytaradi. Loop fornum ustida takrorlanadi va
har bir qiymatda kub o'zgarishini qo'llaydi. Nihoyat, u olingan qiymatlarni ichida
saqlaydi cube.
map()for tsiklisiz bir xil natijaga erishish mumkin:
>>> # Define the transformation function
>>> def cube(num):
...
return num ** 3
>>> # List of numbers to transform
>>> num = [2, 3, 6, 9, 10]
>>> # Call map function to apply cube on each number
>>> cubed = map(cube, num)
>>> # Create a list containing the cubed values
>>> list(cubed)
[8, 27, 216, 729, 1000]
Yuqoridagi misol qiymatlar ro'yxatini map()va foydalanuvchi tomonidan belgilangan
funksiya bilan qanday o'zgartirishni ko'rsatadi.
Python chaqirilishi mumkin bo'lgan har qanday turdagi map()sinflar, misol usullari,
sinf usullari, statik usullar va funktsiyalar bilan ishlaydi.
Foydalanishda odatiy naqsh map()birinchi argument sifatida Python lambda
funktsiyasidan foydalanishdir. Lambda funktsiyalari ifodaga asoslangan funksiyani ga
o'tkazishning qulay usulidir map(). Buni ko'rsatish uchun biz Python lambda
funksiyasidan foydalanib, kub qiymatlari misolini qayta ishlatishimiz mumkin:
>>> # List of input numbers to transform
>>> num = [2, 3, 6, 9, 10]
>>> # Define a lambda function to iterate on each value of num.
>>> cubed = map(lambda n: n ** 3, num)
>>> # Create a list containing the cubed values
>>> list(cubed)
[8, 27, 216, 729, 1000]
Agar siz ga bir nechta takrorlanuvchilarni kiritsangiz map(), transformatsiya funksiyasi
siz kiritgan takrorlanuvchilar soniga teng argumentlarni olishi kerak. Har bir iteratsiya
funksiyaga argument sifatida har bir iteratsiyadan bitta qiymatni uzatadi.
Bir nechta takrorlanuvchilar o'tkazilganda, map()elementlarni takrorlanuvchilar bo'ylab
guruhlaydi. Misol uchun, u har bir birinchi elementni oladi va uni funktsiyaga
o'tkazadi.
Ushbu usul turli xil matematik operatsiyalardan foydalanadigan ikki yoki undan ortiq
raqamli qiymatlarni birlashtirish uchun foydalidir. Bir nechta kiritish
takrorlanuvchilarida turli matematik operatsiyalarni hisoblash uchun Python lambda
funksiyalaridan foydalanadigan ba'zi misollar:
>>> list(map(lambda x, y: x / y, [6, 3, 5], [2, 4, 6]))
[3.0, 0.75, 0.8333333333333334]
>>> list(map(lambda x, y, z: x * y + z, [6, 2], [7, 3], [8, 10]))
[50, 16]
Birinchi misolda biz har biri uchta elementdan iborat ikkita takrorlanuvchini
birlashtirish uchun ajratish operatsiyasidan foydalanamiz. Ikkinchi misolda biz uchta
takrorlanadigan qiymatlarni 6 x 7 + 8 = 50 va 2 x 3 + 10 = 16 kabi ko'paytiramiz va
qo'shamiz.
Shuningdek, map()raqamli qiymatlarning takrorlanuvchilarini qayta ishlash va
o'zgartirish uchun foydalidir; yordamida matematika bilan bog'liq ko'plab
o'zgarishlarni amalga oshirish mumkin map().
ga juda o'xshash STARMAP() NI ham eslatib o'tishimiz kerak map(). Python
hujjatlariga ko'ra, argument parametrlari allaqachon bitta iteratsiyadan kortejlarda
guruhlangan bo'lsa, starmap()o'rniga ishlatiladi, map()ya'ni ma'lumotlar "oldindan
ziplangan".
Qo'ng'iroq qilish uchun starmap()biz import qilishimiz kerak itertools. Keling, bunga
tez misol keltiraylik:
>>> import itertools
>>> # Define a list of tuples
>>> num = [(2, 3), (6, 9), (10,12)]
>>> # Define a lambda function to a list of tuples
>>> multiply = itertools.starmap(lambda x,y: x * y, num)
>>> # Create a list containing the multiplied values
>>> list(multiply)
[6, 54, 120]
Python-da oqimlar ustida
ishlash: filter()
Filtrlash operatsiyasi takrorlanuvchini qayta ishlaydi va berilgan operatsiyani
qondiradigan elementlarni chiqaradi. Bu Python-ning FILTER() o'rnatilgan
funksiyasi bilan amalga oshirilishi mumkin .
Asosiy sintaksis:
filter(function, iterable)
Filtrlash funktsiyalari kiruvchi qiymatlarni filtrlashi va kerakli qiymatlarni chiqishda
saqlashi mumkin. Argument functionbitta argumentli funksiya bo'lishi kerak. Bu
odatda Trueyoki ni qaytaradigan mantiqiy qiymatli funktsiyadir False.
Argument iterablehar qanday Python iteratsiyasi bo'lishi mumkin, masalan, ro'yxat,
kortej yoki to'plam. Shuningdek, u generator va iterator obyektlarini ham ushlab
turishi mumkin. E'tibor bering, filter()faqat bitta iteratsiyani qabul qiladi.
filter()ko'pincha foydalanuvchi tomonidan belgilangan funktsiyani aniqlashning
muqobil usuli sifatida Python lambda funktsiyasi bilan ishlatiladi. Keling, ro'yxatdagi
faqat juft raqamlarni olishni istagan misolni keltiraylik:
>>> # List of numbers
>>> num = [12, 37, 34, 26, 9, 250, 451, 3, 10]
>>> # Define lambda function to filter even numbers
>>> even = list(filter(lambda x: (x % 2 == 0), num))
>>> # Print the even numbers
>>> print(even)
[12, 34, 26, 250, 10]
Yuqoridagi misol filter()raqamlarning juftligini tekshirish uchun ishlatiladi. Agar bu
shart bajarilsa va True qiymatini qaytarsa, juft son "filtrdan o'tadi".
filter()Ro'yxatni tushunish bilan almashtirish mumkinligini unutmang :
# Generate a list with filter()
list(filter(function, iterable))
# Generate a list with a list comprehension
[i for i in iterable if function(i)]
Ikkala holatda ham maqsad ro'yxat ob'ektini qaytarishdir.
Python-da ro'yxatlarni manipulyatsiya qilishda ro'yxatni tushunish yondashuvi ga
qaraganda aniqroq bo'ladi filter(). Biroq, ro'yxatni tushunishda DANGASA
BAHOLASH yo'q . Bundan tashqari, kodni o'qib, biz darhol filter()filtrlash
operatsiyasini amalga oshirayotganini bilamiz. Shu ma'noda, ro'yxatni tushunish
unchalik aniq emas.
Pythonda groupby() va sort()
dan foydalanish
Ushbu qismda biz Python-da oqimlar ustida ishlash uchun boshqa vositalarni
muhokama qilamiz: sort()vagroupby()
Usul sort()Python-da ro'yxatlarni manipulyatsiya qilish uchun foydali vositadir. Misol
uchun, agar siz ro'yxatni o'sish yoki teskari tartibda saralashingiz kerak bo'lsa, siz
quyidagilardan foydalanishingiz mumkin:
>>> num = [24, 4, 13, 35, 28]
>>> # sort the list in ascending order
>>> num.sort()
>>> print(num)
[4, 13, 24, 28, 35]
Va kamayish tartibida:
>>> # sort the list in descending order
>>> numbers.sort(reverse=True)
>>> print(numbers)
[35, 28, 24, 13, 4]
Shuni ta'kidlash kerakki, sort()usul asl ro'yxatni o'zgartiradi va shuning uchun
ro'yxatdagi narsalarni asl holatiga qaytarish mumkin emas.
Keyinchalik, ITERTOOLS.GROUPBY() takrorlanadiganlar ro'yxatini oladi va ularni
belgilangan kalit asosida guruhlaydi. Kalit har bir shaxsga qanday harakat qilish
kerakligini aniqlash uchun foydalidir iterable. Qaytish qiymati { key:value}
shaklida bo'lgani kabi lug'atga o'xshash bo'ladi . Shu sababli, itemsguruhlash uchun
ishlatiladigan kalit bilan bir xil kalit bilan tartiblash juda muhimdir . Bu koddagi
izchillikni ta'minlaydi va kutilmagan natijalarni oldini oladi.
Keling, bizda oylik xarajatlar ro'yxati sifatida saqlanadigan misolni keltiraylik.
Biz ushbu xarajatlarni oy bo'yicha guruhlashni va nihoyat oylik umumiy xarajatlarni
hisoblab chiqmoqchimiz.
>>> import itertools
>>> # Create a list of monthly spendings as a list of tuples
>>> spendings = [("January", 25), ("February", 47), ("March", 38), ("March", 54), ("April", 67),
("January", 56), ("February", 32), ("May", 78), ("January", 54), ("April", 45)]
>>> # Create an empty dictionary to store the data
>>> spendings_dic = {}
>>> # Define a func variable to specify the grouping key
>>> func = lambda x: x[0]
>>> # Group monthly spendings by month in a dictionary
>>> for key, group in groupby(sorted(spendings, key=func), func):
...
spendings_dic[key] = list(group)
>>> spendings_dic
{'April': [('April', 67), ('April', 45)],
'February': [('February', 47), ('February', 32)],
'January': [('January', 25), ('January', 56), ('January', 54)],
'March': [('March', 38), ('March', 54)],
'May': [('May', 78)]}
Yuqoridagi parchada biz sorted()o'rniga ishlatdik sort(). Buning sababi, biz hali
ro'yxat bo'lmagan takrorlanuvchini saralashni xohladik.
dan farqli o'laroq sort(), sorted()asl ro'yxatning nusxasini yaratadi, bu asl tartibni olish
imkonini beradi. sorted()Asl ro'yxatning nusxasini yaratish kerakligi sababli , u dan
sekinroq sort(). Agar siz Python-da tartiblash haqida ko'proq bilmoqchi bo'lsangiz,
men o'zingizning tartiblash mezonlaringizni aniqlashning turli usullarini
tushuntiruvchi maqola yozdim .
map()Va nihoyat, oylik xarajatlarni yig'ish uchun oldingi bo'limdan foydalanishimiz
mumkin :
>>> # Apply map() to sum the monthly spendings
>>> monthly_spendings = {key: sum(map(lambda x: x[1], value)) for key,
value in spendings_dic.items()}
>>> monthly_spendings
{'April': 112, 'February': 79, 'January': 135, 'March': 92, 'May': 78}
Python lambda ifodalarini qo'llash, qatorlarni filtrlash va Pandalar yordamida Python
ma'lumotlar ramkasida ustunlarni tanlash haqida ma'lumot olish uchun Yigit
Arasning MA'LUMOTLAR RAMKASIDA QATORLARNI FILTRLASH VA
USTUNLARNI TANLASH haqidagi ajoyib maqolasiga qarang .
Python-da oqimlar ustida
ishlash: reduce()
Reduction () FUNKTSIYASI KATLAMA yoki qisqartirish deb ataladigan texnikani
amalga oshiradi . U mavjud funktsiyani oladi, uni takrorlanadigan barcha
elementlarga jamlab qo'llaydi va bitta yakuniy qiymatni qaytaradi.
reduce()dastlab o'rnatilgan funksiya bo'lgan va olib tashlanishi kerak
edi. functools.reduce()Ba'zi mumkin bo'lgan ishlash va o'qish mumkin bo'lgan
muammolar tufayli u Python 3.0 ga ko'chirildi .
dan boshqa yechim topa olmasangiz reduce(), uni ishlatishdan qochishingiz kerak.
Funktsiya reduce()ba'zi noqulay ishlash muammolarini keltirib chiqarishi mumkin,
chunki u funksiyalarni bir necha marta chaqiradi va kodingizni sekin va samarasiz
qiladi.
Iloji bo'lsa, ushbu foydalanish holatlarini hal qilish uchun maxsus funksiya bilan
ishlang. sum(), any(), all(), min(), max(), len(), kabi funksiyalar math.prod()tezroq,
o‘qilishi mumkin va Pytonic. Ushbu funktsiyalar C tilida ham yuqori darajada
optimallashtirilgan va amalga oshirilgan bo'lib, ularni tez va samarali qiladi.
reduce()Shuningdek, siz uni foydalanuvchi tomonidan aniqlangan murakkab
funktsiyalar yoki lambda funktsiyalari bilan ishlatganingizda kodingizning o'qilishini
buzishi mumkin. reduce() odatda Python sikliga qaraganda yaxshiroq ishlaydi for,
lekin Python yaratuvchisi Guido Van Rossum tushuntirganidek, Python tsiklini
tushunish odatda ga qaraganda osonroq reduce(). U qo'llanilishini reduce()faqat
assotsiativ operatorlar bilan cheklashni tavsiya qiladi.
Funktsional dasturlashda qo'llaniladigan uchta asosiy usulni to'liq tushuntirish uchun
men qisqartirish() ni va ba'zi foydalanish holatlarini qisqacha tushuntiraman.
reduce()quyidagi sintaksisga ega:
functools.reduce(function, iterable[, initializer])
Python HUJJATLARI reduce() "ikki argument funktsiyasi" ning birinchi argumentiga
ishora qiladi . Biroq, ikkita argument mavjud bo'lsa, biz chaqiriladigan har qanday
Python-dan o'tishimiz mumkin. Chaqiriladigan ob'ektlarga sinflar, misol usullari, sinf
usullari, statik usullar va funktsiyalar kiradi.
Ikkinchi talab qilinadigan argument, iterable, har qanday Python iteratsiyasi bo'lishi
mumkin. Rasmiy PYTHON LUG'ATI iteratsiyani "bir vaqtning o'zida a'zolarini
qaytarishga qodir ob'ekt" deb ta'riflaydi. Takrorlanuvchilarga misollar qatoriga barcha
ketma-ketlik turlari (masalan, roʻyxat, str va kortej) va ketma-ket boʻlmagan baʼzi
turlari, masalan, dict, fayl obʼyektlari va siz __iter__() usuli yoki __getitem__() usuli
bilan aniqlagan har qanday sinf obyektlari kiradi. Sequence semantikasini amalga
oshiradi”.
ning initializerargumenti reduce()ixtiyoriy. Agar siz initsializatorga qiymat
bersangiz, reduce()uni birinchi argumentning funksiyaning birinchi chaqiruviga
yuboradi. Aks holda, u takrorlanadigan qiymatdan birinchi qiymatdan foydalanadi.
Agar siz bo'sh bo'lishi mumkin bo'lgan takrorlanuvchilarni qayta ishlash uchun
foydalanmoqchi bo'lsangiz reduce(), unda boshlang'ichga qiymat berish yaxshi
amaliyotdir. Ushbu qiymat bo'sh bo'lganda standart qaytarish qiymati sifatida
ishlatiladi iterable. Hech qanday qiymat bermasangiz, reduce()TypeError paydo
bo'ladi.
Keling, bir nechta misollarni keltiraylik. Oldingi bo'limda bo'lgani kabi,
biz reduce()yillik xarajatlarni hisoblash uchun foydalanishimiz mumkin:
>>> from functools import reduce
>>> yearly_spendings = reduce(lambda x, y:x + y, monthly_spendings.values())
>>> print(yearly_spendings)
496
Quyidagi misollar qiyinroq, ammo ulardan reduce()foydalanish uchun foydali holatlar
mavjud. Tushunchalar bilan tanishish uchun kod bilan biroz o'ynang.
[[1, 3, 5], [7, 9], [11, 13, 15]]Biz ro'yxatini ga aylantirmoqchimiz [1, 3, 5, 7, 9,
11, 13, 15].
Biz buni quyidagicha qilishimiz mumkin:
>>> from functools import reduce
>>> reduce(list.__add__, [[1, 3, 5], [7, 9], [11, 13, 15]], [])
[1, 3, 5, 7, 9, 11, 13, 15]
reduce()Bundan tashqari , n ta ro'yxatning kesishishini topish uchun ham
foydalanishimiz mumkin . Masalan:
>>> from functools import reduce
>>> num = [[5, 7, 8, 10, 3], [5, 12, 45, 8, 9], [8, 39, 90, 5, 12]]
>>> res = reduce(set.intersection, map(set, num))
>>> print(res)
{8, 5}
Chiqish to'plamdir. Python-dagi to'plamlar haqida ko'proq ma'lumotni BU
ERDA topishingiz mumkin .
Yuqorida aytib o'tilgan misollarga qaramay, foydalanish holatlari
soni reduce()minimaldir, bu nima uchun Python 3 da o'rnatilgan funktsiyalardan olib
tashlanganligini tushuntiradi. Ko'pincha, Python'da ro'yxatlarni manipulyatsiya qilish
uchun boshqa usuldan foydalanganingiz ma'qul. .
Python oqimlari haqidagi
fikrlarni yakunlash
Ushbu maqolada siz Python-da funktsional dasturlash va uning uchta asosiy
usullari, map(), filter()va reduce(). Siz ulardan Python-da ro'yxatlarni boshqarish
uchun foydalanishingiz mumkin. Shuningdek, biz groupby()va dan qanday
foydalanishni muhokama qildik sort().
Bu usullarning barchasi Python-da oqimlarda ishlashni osonlashtiradi. Men sizni ular
bilan o'ynashni, nima qilayotganlarini o'rganishni va natijalarni solishtirishni tavsiya
qilaman. Python haqida umumiy ma'lumot olish
uchun LEARNPYTHON.COM saytida ko'proq manbalarni ham topishingiz mumkin .
Teglar:


Piton
Python Asoslari
Download