مقدمه

تاکنون تمام توابعی که تعریف کرده‌ایم، با استفاده از کلمه کلیدی def و یک نام مشخص بوده‌اند. اما پایتون راهی برای ساخت توابع کوچک و بدون نام نیز فراهم می‌کند که به آنها «توابع لامبدا» یا Lambda Functions گفته می‌شود. این توابع به دلیل سینتکس مختصرشان، برای کارهای ساده و یک‌خطی که نیاز به تعریف یک تابع کامل با def ندارند، بسیار مفید هستند.

سینتکس یک تابع لامبدا

یک تابع لامبدا با کلمه کلیدی lambda شروع می‌شود و به دنبال آن لیستی از پارامترها، یک دونقطه (:) و سپس یک عبارت واحد (expression) می‌آید. این عبارت، مقدار بازگشتی تابع است.

Copy Icon PYTHON
# A regular function
def add(x, y):
    return x + y

# The equivalent lambda function
add_lambda = lambda x, y: x + y

print(add(2, 3))         # 5
print(add_lambda(2, 3)) # 5

در این مثال، تابع add و کلوژر add_lambda دقیقاً یک کار را انجام می‌دهند. همانطور که می‌بینید، تعریف لامبدا بسیار مختصرتر است. ما معمولاً توابع لامبدا را به متغیرها اختصاص نمی‌دهیم (چون در این صورت بهتر است از def استفاده کنیم)، بلکه آنها را مستقیماً به عنوان آرگومان به توابع دیگر پاس می‌دهیم.

کاربرد توابع لامبدا

قدرت واقعی توابع لامبدا زمانی مشخص می‌شود که با توابع سطح بالاتری مانند map، filter و sorted ترکیب شوند. این توابع یک تابع دیگر را به عنوان آرگومان می‌پذیرند تا عملیاتی را روی یک دنباله از داده‌ها اعمال کنند.

استفاده با map

تابع map یک تابع و یک دنباله (مانند یک لیست) را گرفته و آن تابع را روی هر عنصر از دنباله اعمال می‌کند.

Copy Icon PYTHON
nums = [1, 2, 3, 4]
squared_nums = list(map(lambda x: x ** 2, nums))
print(squared_nums) # [1, 4, 9, 16]

در اینجا، به جای تعریف یک تابع square مجزا با def، ما از یک تابع لامبدا یک‌خطی و مختصر برای محاسبه مجذور هر عدد استفاده کرده‌ایم.

استفاده با filter

تابع filter یک تابع و یک دنباله را گرفته و تنها عناصری از دنباله را برمی‌گرداند که تابع برای آنها مقدار True را برگرداند.

Copy Icon PYTHON
nums = [1, 2, 3, 4, 5, 6]
even_nums = list(filter(lambda x: x % 2 == 0, nums))
print(even_nums) # [2, 4, 6]

در این مثال، تابع لامبدا به سادگی بررسی می‌کند که آیا یک عدد زوج است یا خیر و filter تنها اعداد زوج را نگه می‌دارد.

استفاده با sorted

تابع sorted می‌تواند یک پارامتر اختیاری به نام key دریافت کند. این پارامتر باید یک تابع باشد که برای هر عنصر، یک «کلید» برای مرتب‌سازی تولید می‌کند. توابع لامبدا برای این کار ایده‌آل هستند.

Copy Icon PYTHON
points = [(1, 2), (3, 1), (5, 4)]
# Sort the list of points based on their y-coordinate
points_sorted_by_y = sorted(points, key=lambda p: p[1])
print(points_sorted_by_y) # [(3, 1), (1, 2), (5, 4)]

در اینجا، ما لیستی از تاپل‌ها را بر اساس عضو دوم هر تاپل (p[1]) مرتب کرده‌ایم، بدون اینکه نیاز به نوشتن یک تابع نام‌گذاری شده مجزا داشته باشیم.

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