تابعهای لامبدا (Lambda) در پایتون – یک راهنمای مقدماتی


لامبداها در پایتون یکی از مفیدترین، مهمترین و جالبترین ویژگیهایی هستند که میتوان آموخت. متأسفانه اغلب افراد در مورد این توابع دچار سوءبرداشت شده و مسیر اشتباهی را طی میکنند. در این نوشته میخواهیم هر چیزی که لازم است در مورد این توابع اسرارآمیز، شیوه استفاده از آنها و میزان مفید بودنشان بدانید را توضیح دهیم.
پیش از آنکه وارد مثالهای عملی بشویم میبایست محیط مجازی پایتون را نصب کرده باشید. البته اگر نخواهید این محیط را نصب کنید هم میتوانید از پوستههای تعاملی آنلاینی مانند pythonanywhere و pythonfiddle استفاده کنید.
لامبدا در پایتون چیست؟
لامبدا یک روش ساده برای تعریف تابع در پایتون است. این توابع غالباً به نام «عملگرهای لامبدا» یا «تابعهای لامبدا» نامیده میشوند.
اگر قبلاً از پایتون استفاده کرده باشید، احتمالاً توابع خود را با استفاده از کلیدواژه def پایتون تعریف میکنید و این روش نیز تاکنون برای شما به خوبی جواب داده است. پس چرا باید از روش دیگری برای تعریف تابعها استفاده کنیم؟
دلیل این مسئله آن است که تابعهای لامبدا ناشناس هستند. بدین معنی که اینها توابعی هستند که لازم نیست نامی برایشان تعیین کنید. این روش برای تعریف تابعهای کوچک یکبار مصرف در مواردی که تابع اصلی بسیار بزرگ و حجیم است، استفاده میشود.
لامبداها یک شیء تابع بازمیگردانند که میتواند به یک متغیر انتساب یابد. تابع لامبدا به Return در پایتون نیاز ندارد. لامبداها میتوانند هر تعداد آرگومان که لازم باشد داشته باشند؛ اما تنها یک عبارت دارند. نمیتوان توابع دیگر را درون یک لامبدا فراخوانی کرد.
رایجترین استفاده از تابعهای لامبدا در کدهایی است که نیازمند توابع یکخطی سادهای هستند و نوشتن یک تابع معمولی کامل، زیاده کاری محسوب میشود. این مسئله در ادامه در بخش «نگاشت، فیلتر و کاهش» بیشتر توضیح داده شده است.
چگونه از لامبداها در پایتون استفاده کنیم؟
پیش از آنکه تابعهای لامبدا را بررسی کنیم، میبایست به یک تابع بسیار مقدماتی که به روش سنتی تعریف شده است، نگاهی داشته باشیم:
def add_five(number): return number + 5 print(add_five(number=4))
این تابع کاملاً ابتدایی است؛ اما به منظور نمایش کارکرد لامبداها ارائه شده است. تابعی که شما استفاده میکنید، ممکن است بسیار پیچیدهتر از این باشد. این تابع به هر عددی که از طریق پارامتر number به آن ارسال میشود، 5 واحد اضافه میکند.
تابع لامبدای معادل آن چنین است:
add_five = lambda number: number + 5 print(add_five(number=4))
در این جا به جای استفاده از def از کلمه lambda استفاده شده است. نیازی به کروشه نیست؛ اما کلمات پس از کلیدواژه lambda به عنوان پارامتر ایجاد میشوند. از علامت دونقطه (:) برای جدا کردن پارامترها و عبارت استفاده میشود. در این مورد عبارت به صورت number + 5 است.
نیازی به استفاده از کلیدواژه return نیست؛ چون لامبدا به طور خودکار این کار را برای شما انجام میدهد.
در ادامه شیوه ایجاد یک لامبدا با دو آرگومان را میبینید:
add_numbers_and_five = lambda number1, number2: number1 + number2 + 5 print(add_numbers_and_five(number1=4, number2=3))
اگر هنوز در مورد مزیت استفاده از لامبدا دچار شک و تردید هستید، در بخش بعدی آن را عمیقتر بررسی کرده و کارکرد آن را روشنتر میکنیم.
لامبداهای پایتون به همراه نگاشت، فیلتر و کاهش
کتابخانه اصلی پایتون سه متد به نامهای نگاشت (map)، کاهش (reduce) و فیلتر (filter) دارد. این متدها احتمالاً بهترین دلیل استفاده از تابعهای لامبدا هستند.
تابع نگاشت دو آرگومان میگیرد که یک تابع و یک لیست است. این تابع از تابع ورودی استفاده کرده و آن را روی لیست اجرا میکند و لیست اصلاح شده را به صورت یک شیء نگاشت (map) باز میگرداند. تابع list برای تبدیل مجدد شیء نگاشتِ حاصل به یک لیست، مورد استفاده قرار میگیرد.
در ادامه روش استفاده از نگاشت بدون لامبدا را بررسی کردهایم:
list1 = [2, 4, 6, 8] print(list1) def add_five(number): return number + 5 new_list = list(map(add_five, list1)) print(new_list)
این تابع نگاشت بسیار کارآمد است؛ اما میتواند بهتر باشد. تابع add_five به صورت یک آرگومان ارسال میشود؛ اما چه میشد اگر مجبور نبودید هر بار که از نگاشت استفاده میکنید، یک تابع جدید ایجاد نمایید؟ پاسخ این است که به جای آن میتوانید از لامبدا استفاده کنید.
وقتی بخواهیم از لامبدا استفاده کنیم، کد فوق به صورت زیر در میآید:
list1 = [2, 4, 6, 8] print(list1) new_list = list(map(lambda x: x + 5, list1)) print(new_list)
همان طور که میبینید کل تابع add_five دیگر مورد نیاز نیست؛ به جای آن تابع لامبدا برای انجام همان کارها استفاده میشود.
با استفاده از تابع filter این فرایند همان طور باقی میماند. Filter یک تابع را میگیرد و آن را بر روی همه عناصر یک فهرست اعمال میکند و لیست جدیدی با تنها چند عنصر ایجاد میکند که باعث میشود تابع، مقدار صحیح (True) بازگرداند.
نخست بدون لامبدا:
numbers = [1, 4, 5, 10, 20, 30] print(numbers) def greater_than_ten_func(number): if number > 10: return True else: return False new_numbers = list(filter(greater_than_ten_func, numbers)) print(new_numbers)
فایده عملی لامبدا
در این کد هیچ چیز اشتباهی وجود ندارد؛ اما طولانی است. در ادامه با استفاده از لامبدا میبینیم که چندین خط حذف شدهاند:
numbers = [1, 4, 5, 10, 20, 30] print(numbers) new_numbers = list(filter(lambda x: x > 10, numbers)) print(new_numbers)
تابع لامبدا به طور کلی نیاز به greater_than_ten_func را رفع کرده است. و کل کد با تنها 5 کلمه ساده نوشته شده است. به همین دلیل است که لامبدا قدرت زیادی دارد، چون در مورد انجام وظایف ساده حجم کد را بسیار کاهش میدهد.
در نهایت نگاهی به تابع reduce خواهیم داشت. این تابع یکی از توابع جالب پایتون است. Reduce یک محاسبه چرخشی بر روی همه عناصر یک لیست انجام میدهد. از این تابع برای محاسبه مجموع کل یا ضرب کردن همه اعداد با هم میتوان استفاده کرد:
from functools import reduce numbers = [10, 20, 30, 40] print(numbers) def summer(a, b): return a + b result = reduce(summer, numbers) print(result)
در این مثال باید reduce را از ماژول functools ایمپورت کنیم؛ اما جای نگرانی نیست چون ماژول functools بخشی از کتابخانه اصلی پایتون است.
روند کار تقریباً به طور کامل مشابه لامبدا است و نیازی به استفاده از تابع وجود ندارد:
from functools import reduce numbers = [10, 20, 30, 40] print(numbers) result = reduce(lambda a, b: a + b, numbers) print(result)
مسائلی که هنگام استفاده از لامبدا باید در نظر داشت
نمونههایی که در این مقاله ارائه کردیم، نشان میدهند که تابعهای لامبدا تا چه حد ساده هستند و آنها را میتوان به همراه توابع map، filter و reduce از کتابخانه اصلی پایتون مورد استفاده قرار داد. با این حال مواردی نیز وجود دارند که استفاده از لامبدا کمکی به ما نمیکند.
اگر مشغول کار بر روی یک تابع غیر ساده باشید یا بخواهید در تابع خود متدهای دیگری را فراخوانی کنید، بهتر است از تابع معمولی استفاده کنید. لامبداها برای تابعهای یکبار مصرف ناشناس مناسب هستند؛ اما باید تنها یک عبارت داشته باشند. اگر لامبدا با چیزی شبیه یک عبارت regular آغاز شود، در این صورت احتمالاً زمان بازنویسی آن به صورت یک متد اختصاصی فرارسیده است.
اگر این نوشته مورد توجه شما قرار گرفته است، پیشنهاد میکنیم موارد زیر را نیز ملاحظه نمایید:
- عبارتهای لامبدا (lambda) در جاوا ۸ — مرور سریع
- آموزش برنامه نویسی پایتون – مقدماتی
- مجموعه آموزش های پروژه محور برنامه نویسی
- آموزش ساخت ربات تلگرام با پایتون (Python)
- آموزش تکمیلی برنامه نویسی پایتون
- مجموعه آموزشهای برنامهنویسی
==
بسیار عالی و کاربردی. ممنون از زحماتتون
بسیار عالی و قابل فهم.سپاس فراوان
وقت بخیر.
همینطور که توضیح دادین لاندا در پایتون برای ایجاد تابع استفاده میشه.
ولی چگونه میتوان محاسبه لاندا و مو را در ریاضی(در یک معادله مختصاتی) از طریق پایتون انجام داد.
برای مثال
H= OA + λAb+ μAC
AB;AC بردار هستند.
با تشکر فراوان
دنبال یک موضوع دیگه بودم به این مطلب بر خوردم
نمیدونستم پاتون چنین امکاناتی هم مفیدی داره
بسیار عالی. خیلی ممنون از توضیحات خوبتون
سلام
بسیار سپاس 🙂
مطلب خیلی خوبی بود. مثال ها عالی بودن