برنامه نویسی 5542 بازدید

لامبداها در پایتون یکی از مفیدترین، مهم‌ترین و جالب‌ترین ویژگی‌هایی هستند که می‌توان آموخت. متأسفانه اغلب افراد در مورد این توابع دچار سوءبرداشت شده و مسیر اشتباهی را طی می‌کنند. در این نوشته می‌خواهیم هر چیزی که لازم است در مورد این توابع اسرارآمیز، شیوه استفاده از آن‌ها و میزان مفید بودنشان بدانید را توضیح دهیم.

پیش از آن‌که وارد مثال‌های عملی بشویم می‌بایست محیط مجازی پایتون را نصب کرده باشید. البته اگر نخواهید این محیط را نصب کنید هم می‌توانید از پوسته‌های تعاملی آنلاینی مانند pythonanywhere و pythonfiddle استفاده کنید.

لامبدا در پایتون چیست؟

لامبدا یک روش ساده برای تعریف تابع در پایتون است. این توابع غالباً به نام «عملگرهای لامبدا» یا «تابع‌های لامبدا» نامیده می‌شوند.

اگر قبلاً از پایتون استفاده کرده باشید، احتمالاً توابع خود را با استفاده از کلیدواژه def تعریف می‌کنید و این روش نیز تاکنون برای شما به خوبی جواب داده است. پس چرا باید از روش دیگری برای تعریف تابع‌ها استفاده کنیم؟

دلیل این مسئله آن است که تابع‌های لامبدا ناشناس هستند. بدین معنی که این‌ها توابعی هستند که لازم نیست نامی برایشان تعیین کنید. این روش برای تعریف تابع‌های کوچک یک‌بار مصرف در مواردی که تابع اصلی بسیار بزرگ و حجیم است، استفاده می‌شود.

لامبداها یک شیء تابع بازمی‌گردانند که می‌تواند به یک متغیر انتساب یابد. لامبداها می‌توانند هر تعداد آرگومان ‌که لازم باشد داشته باشند؛ اما تنها یک عبارت دارند. نمی‌توان توابع دیگر را درون یک لامبدا فراخوانی کرد.

رایج‌ترین استفاده از تابع‌های لامبدا در کدهایی است که نیازمند توابع یک‌خطی ساده‌ای هستند و نوشتن یک تابع معمولی کامل، زیاده کاری محسوب می‌شود. این مسئله در ادامه در بخش «نگاشت، فیلتر و کاهش» بیشتر توضیح داده شده است.

چگونه از لامبداها در پایتون استفاده کنیم؟

پیش از آن‌که تابع‌های لامبدا را بررسی کنیم، می‌بایست به یک تابع بسیار مقدماتی که به روش سنتی تعریف شده است، نگاهی داشته باشیم:

این تابع کاملاً ابتدایی است؛ اما به منظور نمایش کارکرد لامبداها ارائه شده است. تابعی که شما استفاده می‌کنید، ممکن است بسیار پیچیده‌تر از این باشد. این تابع به هر عددی که از طریق پارامتر number به آن ارسال می‌شود، 5 واحد اضافه می‌کند.

تابع لامبدای معادل آن چنین است:

در این جا به جای استفاده از def از کلمه lambda استفاده شده است. نیازی به کروشه نیست؛ اما کلمات پس از کلیدواژه lambda به عنوان پارامتر ایجاد می‌شوند. از علامت دونقطه (:) برای جدا کردن پارامترها و عبارت استفاده می‌شود. در این مورد عبارت به صورت number + 5 است.

نیازی به استفاده از کلیدواژه return نیست؛ چون لامبدا به طور خودکار این کار را برای شما انجام می‌دهد.

در ادامه شیوه ایجاد یک لامبدا با دو آرگومان را می‌بینید:

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

لامبداهای پایتون به همراه نگاشت، فیلتر و کاهش

کتابخانه اصلی پایتون سه متد به نام‌های نگاشت (map)، کاهش (reduce) و فیلتر (filter) دارد. این متدها احتمالاً بهترین دلیل استفاده از تابع‌های لامبدا هستند.

تابع نگاشت دو آرگومان می‌گیرد که یک تابع و یک لیست است. این تابع از تابع ورودی استفاده کرده و آن را روی لیست اجرا می‌کند و لیست اصلاح شده را به صورت یک شیء نگاشت (map) باز می‌گرداند. تابع list برای تبدیل مجدد شیء نگاشتِ حاصل به یک لیست، مورد استفاده قرار می‌گیرد.

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

این تابع نگاشت بسیار کارآمد است؛ اما می‌تواند بهتر باشد. تابع add_five به صورت یک آرگومان ارسال می‌شود؛ اما چه می‌شد اگر مجبور نبودید هر بار که از نگاشت استفاده می‌کنید، یک تابع جدید ایجاد نمایید؟ پاسخ این است که به جای آن می‌توانید از لامبدا استفاده کنید.

وقتی بخواهیم از لامبدا استفاده کنیم، کد فوق به صورت زیر در می‌آید:

همان طور که می‌بینید کل تابع add_five دیگر مورد نیاز نیست؛ به جای آن تابع لامبدا برای انجام همان کارها استفاده می‌شود.

با استفاده از تابع filter این فرایند همان طور باقی می‌ماند. Filter یک تابع را می‌گیرد و آن را بر روی همه عناصر یک فهرست اعمال می‌کند و لیست جدیدی با تنها چند عنصر ایجاد می‌کند که باعث می‌شود تابع، مقدار صحیح (True) بازگرداند.

نخست بدون لامبدا:

فایده عملی لامبدا

در این کد هیچ چیز اشتباهی وجود ندارد؛ اما طولانی است. در ادامه با استفاده از لامبدا می‌بینیم که چندین خط حذف شده‌اند:

تابع لامبدا به طور کلی نیاز به greater_than_ten_func را رفع کرده است. و کل کد با تنها 5 کلمه ساده نوشته شده است. به همین دلیل است که لامبدا قدرت زیادی دارد، چون در مورد انجام وظایف ساده حجم کد را بسیار کاهش می‌دهد.

در نهایت نگاهی به تابع reduce خواهیم داشت. این تابع یکی از توابع جالب پایتون است. Reduce یک محاسبه چرخشی بر روی همه عناصر یک لیست انجام می‌دهد. از این تابع برای محاسبه مجموع کل یا ضرب کردن همه اعداد با هم می‌توان استفاده کرد:

در این مثال باید reduce را از ماژول functools ایمپورت کنیم؛ اما جای نگرانی نیست چون ماژول functools بخشی از کتابخانه اصلی پایتون است.

روند کار تقریباً به طور کامل مشابه لامبدا است و نیازی به استفاده از تابع وجود ندارد:

مسائلی که هنگام استفاده از لامبدا باید در نظر داشت

نمونه‌هایی که در این مقاله ارائه کردیم، نشان می‌دهند که تابع‌های لامبدا تا چه حد ساده هستند و آن‌ها را می‌توان به همراه توابع map، filter و reduce از کتابخانه اصلی پایتون مورد استفاده قرار داد. با این حال مواردی نیز وجود دارند که استفاده از لامبدا کمکی به ما نمی‌کند.

اگر مشغول کار بر روی یک تابع غیر ساده باشید یا بخواهید در تابع خود متدهای دیگری را فراخوانی کنید، بهتر است از تابع معمولی استفاده کنید. لامبداها برای تابع‌های یک‌بار مصرف ناشناس مناسب هستند؛ اما باید تنها یک عبارت داشته باشند. اگر لامبدا با چیزی شبیه یک عبارت regular آغاز شود، در این صورت احتمالاً زمان بازنویسی آن به صورت یک متد اختصاصی فرارسیده است.

اگر این نوشته مورد توجه شما قرار گرفته است، پیشنهاد می‌کنیم موارد زیر را نیز ملاحظه نمایید:

==

میثم لطفی (+)

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

بر اساس رای 17 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *