کار با توابع lambda در پایتون
مقدمه
پس از معرفی انواع داده ها در پایتون و صحبت در مورد توابع و عبارات شرطی و حلقه ها کم کم وارد مباحث پیشرفته تری از پایتون می شویم. در این جلسه قصد داریم از توابع Lambda صحبت کنیم. ما قبلا در مورد توابع در پایتون یک جلسه صحبت کردیم که پیشنهاد می شود قبل از مطالعه این جلسه حتما آن را مطالعه کنید:
توابع Lambdaچیست ؟
[ihc-hide-content ihc_mb_type=”show” ihc_mb_who=”2,3,4,5″ ihc_mb_template=”4″ ]
در پایتون توابع بدون نام ( به انگلیسی anonymous Function) توابعی هستند که اسمی برای آنها تعریف نمی شود. به این توابع lambda function و یا lambda expression نیز گفته می شود.
توابع معمولی در پایتون با کلمه کلیدی def و توابع بدون نام با کلمه کلیدی lambda مشخص می شوند.
چگونه میتوان از توابع lambda در پایتون استفاده کرد ؟
syntax مربوط به این توابع در زیر آورده شده است :
یک تابع lambda میتواند هر تعداد argument (ورودی) داشته باشند و فقط یک expression میتواند داشته باشد. منظور از expression در واقع بخشی است که ارزیابی و حل می شود و نتیجه آن در argument ها ریخته می شود.
مثالی از توابع lambda در پایتون:
در زیر مثالی از یک تابع lambda آورده شده است که ورودی خود را دو برابر می کند:
# Program to show the use of lambda functions double = lambda x: x * 2 # Output: 10 print(double(5))
در مثال بالا lambda x: x * 2
یک تابع lambda است که argument آن x می باشد و expression آن نیز x*2 می باشد که نتیجه آن ارزیابی می شود و در double قرار میگیرد.
اگر بخواهیم مثال بالا را به صورت عادی بنویسیم در این صورت به تابعی شبیه تابع زیر می رسیم.
def double(x): return x * 2
مثال : در زیر نمونه ای از یک تابع lambda آورده شده است که دو ورودی دارد:
>>> add = lambda x, y: x + y >>> add(5, 3) 8
همانطور که میبینید دو ورودی x و y داریم و عملیات جمع بر روی این دو ورودی انجام می شود و نتیجه در add ریخته می شود.
مثال هایی از کاربرد توابع Lambda
مرتب کردن(sort) یک list به کمک عبارت lambda :
یکی از کاربردهای خیلی بزرگ عبارت lambda در sort کردن یک list می باشد. در واقع به کمک این عبارات میتوانیم معیاری را برای مرتب کردن یک لیست مشخص کنید.
معرفی تابع sorted : در تابع sorted که در پایتون برای sort کردن لیست استفاده می شود. ورودی های این تابع سه مورد می باشد که اولین ورودی آن اجباری است و ورودی های بعدی اختیاری است.
ورودی اول : همانطور که انتظار داریم ورودی اول یک لیست است.
ورودی دوم :ورودی دوم یک key نیز داریم که معیار sort کردن را برای ما مشخص میکند. در واقع با کمک key میگوییم که این لیست را طبق این معیار sort کن. مثلا لیست را طبق توان دوم اعداد sort کن. یعنی اعدادی اول باشند که توان دوم آن ها کوچکتر باشد و به مرور در طول لیست توان دوم آنها افزایش یابد.
ورودی سوم : ورودی reverse نیز داریم که مشخص میکند لیست به صورت صعودی مرتب شود و یا نزولی.به صورت پیش فرض لیست به صورت صعودی مرتب می شود.
اجازه بدهید برای درک بهتر مثالی را در اینجا مطرح کنیم :
my_list = [4,7,-1,2,-5] sorted(my_list , key = lambda r:r**2)
نتیجه خروجی این کد به صورت زیر است :
[-1, 2, 4, -5, 7]
در مثال بالا یک لیست را تعریف کرده ایم و سپس از تابع sorted استفاده کرده ایم. در این تابع متغیر key را برابر با یک عبارت lambda قرار داده ایم و گفته این که ورودی تو r (که در اینجا همان لیست است) می باشد و عبارت مورد پردازش که در خروجی key قرار میگیرد نیز توان دوم اعداد ورودی است. در واقع گفته ایم که توان دوم این اعداد را دریافت کن و اعداد را طبق توان دوم آنها مرتب کن. به همین خاطر در خروجی نیز اعداد بر حسب توان دوم آنها مرتب شده اند. یعنی اعدادی که توان دوم آنها کوچکتر است در ابتدا آمده است و به همین ترتیب در ادامه اعدادی که توان دوم آنها بزرگتر می شود قرار داده شده است.
استفاده از عبارت lambda در تابع filter :
قبل از هر چیز باید تابع filter را معرفی کنیم.
تابع filter در واقع عنصری که در ورودی خود دارد را با تابعی که ما برای آن مشخص کرده ایم فیلتر میکند. یعنی یک سری عناصر را میگیرد و آن را به تابع میدهد. اگر تابع True برگرداند آن عنصر در خروجی فیلتر قرار میگیرد و اگر False برگرداند نیز آن را در خروجی قرار نمی دهد و در واقع فیلتر می کند.
به جای function در شکل بالا میتوانیم از عبارت lambda استفاده کنیم. مثال زیر را ببینید:
my_list = [4,7,-1,2,-5] new_list = list(filter(lambda x:x>0 , my_list)) print(new_list)
در مثال بالا یک لیست را تعریف کرده ایم و سپس میخواستیم یک لیست جدید بسازیم که در این لیست فقط اعداد مثبت باشد.
در خط دوم ابتدا از کلمه کلیدی list استفاده شده است تا خروجی تابع filter به لیست تبدیل شود. سپس در ورودی اول که تابع ماست از عبارت lambda استفاده کرده ایم و expression را بر مثبت بودن اعداد قرار داهد ایم. ورودی دوم نیز لیست تعریف شده در خط اول می باشد. نتیجه در new_list ریخته شده است. اگر این کد را اجرا کنیم نتیجه به صورت زیر خواهد بود:
[4, 7, 2]
میبینیم که در خروجی فقط اعداد مثبت قرار گرفته اند و در واقع اعداد مثبت فیلتر شده اند.
[/ihc-hide-content]
استفاده از تابع lambda همراه با تابع map:
معرفی تابع map:
تابع map یک تابع و یک لیست را در ورودی خود میگیرد و تک تک المان های آن لیست را به تابع ارسال می کند و خروجی آن تابع را در یک لیست جدید قرار می دهد.
در اینجا نیز میتوانیم به جای تابع مورد نظر از عبارت lambda استفاده کنیم. مثال زیر را ببینید:
# Program to double each item in a list using map() my_list = [1, 5, 4, 6, 8, 11, 3, 12] new_list = list(map(lambda x: x * 2 , my_list)) # Output: [2, 10, 8, 12, 16, 22, 6, 24] print(new_list)
در مثال بالا my_list را دریافت کرده ایم و تک تک عناصر را به تابع lambda فرستاده ایم و این تابع نیز مقادیر را دو برابر کرده است و نتیجه خروجی به لیست تبدیل شده است و سپس در new_list قرار داده شده است.
در پایان جلسه برای درک بهتر تابع lambda پیشنهاد می شود حتما تمرینات زیر را انجام دهید :
تمرین ۱ :به کمک filter و lambda برنامه ای بنویسید که اعداد زوج یک لیست [1,0,-2,4,-7,12 ] را جدا کند.
تمرین ۲ : برنامه ای بنویسید لیست [(1, 2), (4, 1), (9, 10), (13, –3)] را بگیرد و آن را بر حسب المان های دومش به صورت reverse مرتب کند.
نکته : پس از حل سوالات ، لطفا کد های خود را در قسمت کامنت ها قرار دهید تا در صورتی که دوستان دیگر دچار مشکل شدند ، از کدهای شما کمک بگیرند.
مثل همیشه میتوانید ما را در تلگرام و یا اینستاگرام دنبال کنید :
2 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
mylist = [1,0,-2,4,-7,12 ]
func = list(filter(lambda x: x%2==0,mylist))
print(func)
با سلام.
کد شما برای سوال ۱ کاملا صحیح می باشد.
موفق باشید.