آقای ربات
آقای ربات
خواندن ۴ دقیقه·۳ سال پیش

سه تفنگدار پایتون: توابع map/filter/reduce

کاوره (چیز خاصی نیست!)
کاوره (چیز خاصی نیست!)

پایتون یکی از زیباترین زبان‌های برنامه‌نویسیه! من قبل پایتون کلی زبان تست کردم، از سی پلاس پلاس رفتم سمت ویژوال بیسیک، از ویژوال بیسیک سمت سی شارپ، از سی شارپ سمت جاوا، از جاوا به پی اچ پی و.... تا وقتی که رسیدم به پایتون و دیگه همونجا قفل شدم! "من زبان مناسب خودمو پیدا کردم!"

اگر زبان مناسب شما هم پایتون هستش خیلی واجبه که توش مناسب هم کدنویسی کنیم! یعنی از قابلیت‌های خوب پایتون استفاده کنیم. یکی از این قابلیت‌ها یا بهتره بگم سه تا از این قابلیت‌ها، سه تابعی هستش که من بهشون لقب سه تفنگدار دادم و توی این پست میخوام کمی ازشون بگم...


تفنگدار اول: مَپ یا map
تابع مپ کارش اینه که یه تابعی رو، روی یه مجموعه از داده‌ها اعمال کنه. یعنی چی؟! مثال توی دنیای واقعی بخوام بزنم فرض کنید توی یه مدرسه ای میخوایم اعضای یه کلاسی رو واکسینه کنیم! اگر داده‌ها، دانش‌آموزها باشن، تابع اصلی واکسینه کردن، اون فردی که میخواد واکسن رو بزنه میشه تابع مَپ ما...! (مثال ضعیفی زدم..!)

حالا توی برنامه‌نویسی ببینیم. فرض کنید یه لیست داریم به شکل زیر:

a = [1,2,3,4,5,6]

کاری که میخوایم بکنیم اینه که بیایم تمام اعضاشو به توان 2 برسونیم. تابع این کار چی میشه؟!

def t2(n): return n**2

داده‌ها رو داریم، تابع اصلی رو هم داریم حالا وقت استفاده از مَپ هستش:

b = list(map(t2,a)) print(b)

چیکار کردیم؟! گفتیم که تابع t2 رو مَپ کن به اعضای لیست a و بعدش نتیجه رو تبدیل به لیست کن و داخل b نگه دار! در نهایت چاپش هم کردیم! به همین خوشمزگی!

اما نکته‌ای که هست اینه که کدهای بهتره که هوشمندتر از این باشن پس اینجا میتونیم بیایم و از توابع لامبدا استفاده کنیم. یعنی میشه نوشت:

b = list(map(lambda x:x**2,a))

این کد هم دقیقا همون کار رو میکنه فقط دیگه نیازی به تعریف تابع نیست! خب این از مَپ. بریم بعدی :)


تفنگدار دوم: فیلتر یا filter
تابع بعدی ما، کارش از اسمش مشخصه! فیلتر میکنه! خیلی هم سخت گیرانه فیلتر میکنه! مثال از دنیای واقعی بخوام بزنم فرض کنید میخواین برنج آبکش کنید! داده‌هایی که دارین اینا هستن: آب و برنج! حالا میاین یه صافی برمیدارین و این داده‌ها رو میریزین داخلش. چه اتفاقی میوفته؟ آب میره و برنج میمونه! صافی همون تابع فیلتر ماس که شرطی داره که برای آب صدق نیست و برای برنج صدق میکنه! اونم اندازه سوراخ‌های صافی هستش که برنج توش گیر میکنه ولی آب...نوچ!

پس تابع فیلتر میاد داده‌ها رو میذاره توی یه تابع دیگه، اگر توی اون تابع، خروجی true باشه یعنی واجد شرایط باشه، نگه میداره، اگر نباشه نگه نمیداره! ببینید:

a = [-5,-7,34,15,-1,2,-77,80] b = list(filter(lambda x:x>0,a)) print(b)

همونطور که میبینید، یه لیستی داریم توش اعداد مثبت و منفی وجود دارن. حالا اومدیم و فیلترشون کردیم.. چطوری؟! یه تابع لامبدا داریم که میگه x:x>0 یعنی ایکس‌ها، به طوری که ایکس‌ها از صفر بزرگتر باشن! ایکس‌ اشاره میکنه به تمام اعضای لیست a... درنهایت خروجی تبدیل به لیست میشه و توی b قرار میگیره!

پس خروجی چی میشه؟! فقط اعداد مثبتی که داخل b هستن!

"چند روز پیش داشتم یه بات مینوشتم و میخواستم تمام لینک‌های یه صفحه که دارای یه قابلیت خاص هستن رو از تمام لینک‌هایی که توی یه صفحه وجود دارن، جدا کنم و اینجا بود که طعم شیرین استفاده از تابع filter رو چشیدم!"


تفنگدار سوم: ری‌دیوس! یا reduce
رسیدیم به آخرین تابع! تابع reduce کاراییش از مقایسه کردن گرفته تا جمع کردن و...! مثالش تو دنیای واقعی مثل یه شخصیه که عاشق ارزیابیه! مثلا فرض کنید میخوایم تمام اعضای لیست رو با هم جمع کنیم:

from functools import reduce
a = [1,2,3,4,5]
b = reduce(lambda x,y:x+y,a) print(b)

این کد تمام اعضای لیست a رو برای شما جمع میکنه. البته اگر دقت کنید دو تا نکته متفاوته تو این بخش! یکی اینکه تابع reduce رو باید از کتابخونه functools ایمپورت کنیم! (این تفنگدار خونه‌شون شهر دیگس!) و نکته دیگه اینکه خروجی رو دیگه نیازی نیست به لیست تبدیل کنیم چون معمولا یه عدده! مثلا اینجا جمع تمام آیتم‌هاس یعنی: 15

یا میتونیم با این تابع بزرگترین عدد رو تشخیص بدیم:

from functools import reduce
a = [1,2,3,4,5]
b = reduce(lambda x,y:x if x>y else y,a) print(b)

در واقع کاری که reduce میکنه اینه که دوتا دوتا آیتم‌ها رو برمیداره و باهاشون کار میکنه! مثلا اینجا دوتا از آیتم ها رو برمیداره و میبینه کدوم بزرگتره؟! اونو نگه میداره و آیتم بعدی رو برمیداره و دوباره مقایسه میکنه، و همینطوری میره تا آخر تا اینکه به بزرگترین عدد میرسه. اگر این کد رو هم اجرا کنید خروجی میشه 5...!


سخنان پایانی!
حرف آخرم اینه که از این توابع به راحتی نگذرین! سعی کنید توی پروژه‌هاتون از اینا استفاده کنید و کدهاتون رو خیلی هوشمندانه کنید! موفق و بی باگ باشین! تا پست‌های بعدی خداحافظ :)

پایتونآموزش پایتونبرنامه نویسی پایتونpython
سلام من آقای ربات هستم و اینجا مطالبی در مورد پایتون، جنگو، دیتاساینس و گاهی در مورد برنامه نویسی، قرار میدم.
شاید از این پست‌ها خوشتان بیاید