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