تابع Lambda در پایتون یک نوع تابع ناشناس «Anonymous function» است که برای ایجاد توابع ساده و کوتاه به کار میرود. این توابع معمولاً برای انجام عملیاتهای ساده یا عبوری در کدهایی که نیاز به یک تابع موقت دارند، استفاده میشوند. ساختار توابع lambda برخلاف توابع معمولی که از کلمهکلیدی def برای تعریف استفاده میکنند، سادهتر است و به صورت یک عبارت «expression» تعریف میشود. این توابع معمولاً در مواقعی که نیاز به یک تابع کوچک و یکخطی داریم، مانند هنگام استفاده از توابعی مانند ()map() filter, یا ()sorted, بسیار مفید هستند.
مقدمه
یک ویژگی جالب تابع Lambda در پایتون این است که میتوانند پارامترهای متعددی بپذیرند و تنها یک عبارت را به عنوان خروجی برگردانند. برخلاف توابع معمولی که میتوانند چندین دستور داشته باشند، توابع `lambda` تنها یک عبارت را میپذیرند و نتیجه آن را به صورت خودکار برمیگردانند. این ویژگی باعث میشود که تابع Lambda در پایتون گزینهای مناسب برای مواقعی باشند که نیاز به توابع کوتاه و سریع داریم که در یک خط قابل نوشتن باشند.
در یادگیری زبان پایتون، درک درست مفاهیم برنامه نویسی امری ضروری است. در همین موضوع در زبان برنامه نویسی پایتون توابعی وجود دارند که در اصطلاح به آنها توابع ناشناس میگویند به همین دلیل در این مقاله به توضیح و تشریح تابع Lambda در پایتون به همراه مثال و کد خواهیم پرداخت. تابع Lambda در پایتون جزو توابع ناشناس «Anonymous» هستند، به این معنی که این توابع بدون نام هستند. برای تعریف یک تابع معمولی در پایتون از کلیدواژه def استفاده میشود. به همین صورت، برای تعریف یک تابع ناشناس از کلیدواژه lambda استفاده میشود.
در این مثال، یک تابع Lambda به نام upper تعریف کردهایم تا با استفاده از متد ()upper یک رشته را به حروف بزرگ تبدیل کند.
s1 = 'ProgramStore' s2 = lambda func: func.upper() print(s2(s1))
خروجی:
PROGRAMSTORE
این تکه کد یک تابع Lambda در پایتون به نام upper تعریف میکند که یک رشته را بهعنوان آرگومان میپذیرد و آن را با استفاده از متد ()upper به حروف بزرگ تبدیل میکند. سپس این تابع Lambda روی رشتهی «ProgramStore» اعمال شده و نتیجه چاپ میشود.
بیایید تابع Lambda را دقیقتر بررسی کنیم:
سینتکس تابع Lambda در پایتون
- lambda: کلیدواژهای برای تعریف یک تابع.
- آرگومانها: لیستی از پارامترهای ورودی که با کاما از هم جدا میشوند (مشابه توابع معمولی).
- عبارت: یک عبارت منفرد که ارزیابی شده و بهعنوان خروجی بازگردانده میشود.
بیایید چند کاربرد عملی از تابع Lambda در پایتون را بررسی کنیم.
تابع Lambda با شرطگذاری در پایتون
یک تابع Lambda در پایتون میتواند با استفاده از دستورهای if شامل شرط باشد. این کار به شما امکان میدهد تا عملیات شرطی ساده را در یک خط کد انجام دهید.
# Example: Check if a number is positive, negative, or zero n = lambda x: "Positive" if x > 0 else "Negative" if x < 0 else "Zero" print(n(5)) print(n(-3)) print(n(0))
خروجی:
Positiv Negativ Null
- تابع Lambda در پایتون از x بهعنوان ورودی استفاده میکند.
- از شرطهای تو در تو (if-else) استفاده میکند تا «مثبت»، «منفی» یا «صفر» را برگرداند.
تفاوت بین تابع Lambda و def در چیست؟
Lambda مختصر است اما در پردازش منطقهای پیچیده بهاندازه def قدرتمند نیست.
عملگر عادی (def) | تابع لامبدا | ویژگی خاص |
چندین خط کد | عبارت واحد با لامبدا | تعریف |
باید اسم داشته باشد | ناشناس (یا با نام در صورت اختصاص) | نام |
ممکن است حاوی چندین دستورالعمل باشد | فقط بیان واحد | نظرات |
ممکن است حاوی رشته های مستند باشد | نمیتواند مدرکی وجود داشته باشد | مستندات |
برای مناطق قابل استفاده مجدد و پیچیده بهتر است. | بهترین برای عملکردهای کوتاه و موقت | قابلیت استفاده مجدد |
# Using lambda sq = lambda x: x ** 2 print(sq(3)) # Using def def sqdef(x): return x ** 2 print(sqdef(3))
خروجی:
۹ ۹
همانطور که در مثال بالا میبینیم، هر دو تابع ()sq و ()sqdef بهدرستی و مشابه یکدیگر عمل میکنند.
تابع Lambda با List Comprehension
ترکیب Lambda با List Comprehension به ما امکان میدهد تا تغییرات روی دادهها را به شکلی مختصر اعمال کنیم. به مثال زیر توجه کنید:
li = [lambda arg=x: arg * 10 for x in range(1, 5)] for i in li: print(i())
خروجی:
۱۰ ۲۰ ۳۰ ۴۰
تابع Lambda هر عنصر را به توان دو میرساند.
- List Comprehension روی لیست li تکرار میکند و Lambda را روی هر عنصر اعمال میکند.
- این روش برای اعمال تغییرات روی مجموعه دادهها در وظایف پیشپردازش یا دستکاری دادهها ایدهآل است.
تابع Lambda با if-else در پایتون
توابع Lambda میتوانند منطق شرطی را مستقیماً در خود جای دهند و امکان تصمیمگیریهای ساده را درون تابع فراهم کنند.
# Example: Check if a number is even or odd check = lambda x: "Even" if x % 2 == 0 else "Odd" print(check(4)) print(check(7))
خروجی:
Even Odd
تابع Lambda بررسی میکند که آیا عدد بر ۲ تقسیمپذیر است (x % 2 == 0).
- اگر درست باشد، «Even» و در غیر این صورت «Odd» را برمیگرداند.
- این روش برای برچسبگذاری یا دستهبندی مقادیر بر اساس شرایط ساده مفید است.
تابع Lambda با چند دستور در پایتون
توابع Lambda اجازهی استفاده از چند دستور را نمیدهند، اما میتوانیم دو تابع Lambda بسازیم و سپس تابع Lambda دوم را بهعنوان پارامتر به تابع اول ارسال کنیم.
# Example: Perform addition and multiplication in a single line calc = lambda x, y: (x + y, x * y) res = calc(3, 4) print(res)
خروجی:
(۷, ۱۲)
- تابع Lambda هم جمع و هم ضرب را انجام داده و یک tuple شامل هر دو نتیجه بازمیگرداند.
- این روش برای موقعیتهایی که نیاز به انجام محاسبات متعدد و بازگرداندن نتایج بهصورت همزمان است، مفید است.
استفاده از تابع Lambda با ()filter در پایتون
تابع ()filter در پایتون یک تابع و یک لیست را بهعنوان آرگومان میپذیرد. این تابع روشی زیبا برای فیلتر کردن تمام عناصر یک توالی است که برای آنها تابع مقدار True بازمیگرداند.
# Example: Filter even numbers from a list n = [1, 2, 3, 4, 5, 6] even = filter(lambda x: x % 2 == 0, n) print(list(even))
خروجی:
[۲, ۴, ۶]
تابع Lambda بررسی میکند که آیا یک عدد زوج است (x % 2 == 0).
تابع ()filter این شرط را روی هر عنصر در لیست nums اعمال میکند.
استفاده از تابع Lambda با ()map در پایتون
تابع ()map در پایتون یک تابع و یک لیست را بهعنوان آرگومان میپذیرد. این تابع با استفاده از Lambda فراخوانی میشود و یک لیست جدید بازمیگرداند که شامل تمام آیتمهای تغییر دادهشده توسط Lambda برای هر عنصر است.
# Example: Double each number in a list a = [1, 2, 3, 4] b = map(lambda x: x * 2, a) print(list(b))
خروجی:
[۲, ۴, ۶, ۸]
- تابع Lambda هر عدد را دو برابر میکند.
- ()map روی لیست a تکرار میکند و تغییرات را اعمال میکند.
استفاده از تابع Lambda با ()reduce در پایتون
تابع ()reduce در پایتون یک تابع و یک لیست را بهعنوان آرگومان میپذیرد. این تابع با استفاده از Lambda فراخوانی شده و یک نتیجهی کاهشیافتهی جدید بازمیگرداند. این عملیات بهصورت تکراری روی زوجهای عناصر در iterable انجام میشود. تابع ()reduce در ماژول functools قرار دارد.
from functools import reduce # Example: Find the product of all numbers in a list a = [1, 2, 3, 4] b = reduce(lambda x, y: x * y, a) print(b)
خروجی:
۲۴
- تابع Lambda دو عدد را در هر مرحله ضرب میکند.
- تابع reduce این عملیات را روی کل لیست اعمال میکند.
نتیجه گیری
در نتیجه، تابع Lambda در پایتون ابزار قدرتمندی برای نوشتن کدهای کوتاه و مؤثر هستند. این توابع به خصوص زمانی که نیاز به یک تابع موقت و ساده داریم، مانند پردازشهای سریع درون توابع ()map(), filter(), یا ()sorted, بسیار مفید و کاربردی هستند. استفاده از lambda میتواند به کاهش حجم کد و افزایش خوانایی آن کمک کند، به شرطی که در مواقع مناسب و برای عملیاتهای ساده از آنها استفاده شود. هرچند برای توابع پیچیدهتر و با چندین دستور، استفاده از توابع معمولی با def گزینه بهتری است.