lambda
یک روش دیگر برای تعریف تابع استفاده از توابع ناشناس که با عنوان توابع lambda شناخته میشوند. در این قسمت شما نحوه تعریف و استفاد از آن را یاد خواهید گرفت. در پایتون تابع ناشناس تابعی هست که بدون نام تعریف میشود. در حالی که توابع معمولی با استفاده از کلمه کلیدی def تعریف میشوند، توابع ناشناس با استفاده از کلمه کلیدی lambda تعریف میشوند. به خاطر همین توابع ناشناس توابع lambda نامیده میشوند.
خوبه بدونید عده ای از لامبدا میترسن، عده ای آن را دوست دارند و عده ای هم از آن متنفرن. مطمئنا در پایان این مطلب عاشق آن میشوید. عملگر لامبدا یا تابع lambda راهی برای ایجاد توابع ناشناس کوچک است، یعنی توابع بدون نام. این توابع چیز بی ممصرفی هستن یعنی فقط در جایی که تعریف میشوند مورد استفاده قرار میگیرند. توابع لامبدا به طور عمده در ترکیب با توابع ()filter(), map و reduce() استفاده میشوند. ویژگی لامبدا به دلیل تقاضای برنامه نویسان Lisp به پایتون اضافه شد.
سینتکس کلی یک تابع لامبدا بسیار ساده است:
lambda argument_list: expression.
argument list شامل یک لیست از آرگومان جدا شده با کاما است و expression عبارت محاسباتی با استفاده از این آرگومانها است. شما می توانید تابع را به یک متغیر اختصاص دهید تا نامی به آن بدهید.
مثال زیر از یک تابع لامبدا، مجموع دو آرگومان را به دست می آورد:
>>> f = lambda x, y : x + y >>> f(1,1) 2
فایده و مزیت عملگر لامبدا زمانی که در ترکیب با map() استفاده می شود، دیده می شود. map () یک تابع با دو آرگومان است:
r = map(func, seq)
اولین آرگومان func نام یک تابع وآرگومان دوم seq یک دنباله (به عنوان مثال یک لیست) است.
map()، تابع func روی تمام عناصر seg اعمال میکند. . map() یک لیست جدید را با عناصری که توسط func تغییر می کنند، باز می گرداند.
>>> def fahrenheit(T):
return ((float(9)/5)*T + 32)
>>> def celsius(T):
return (float(5)/9)*(T-32)
>>> temp = (36.5, 37, 37.5,39)
>>> F = map(fahrenheit, temp)
>>> C = map(celsius, F)
در مثال بالا ما از لامبدا استفاده نکرده ایم. با استفاده از لامبدا، ما نباید تعریف و نام توابع فارنهایت () و سانتیگراد () را داشته باشیم.
>>> Celsius = [39.2, 36.5, 37.3, 37.8]
>>> Fahrenheit = map(lambda x: (float(9)/5)*x + 32, Celsius)
>>> print (Fahrenheit)
[۱۰۲٫۵۶, ۹۷٫۷۰۰۰۰۰۰۰۰۰۰۰۰۰۳, ۹۹٫۱۴۰۰۰۰۰۰۰۰۰۰۰۰۱, ۱۰۰٫۰۳۹۹۹۹۹۹۹۹۹۹۹۹]
>>> C = map(lambda x: (float(5)/9)*(x-32), Fahrenheit)
>>> print (C)
[۳۹٫۲۰۰۰۰۰۰۰۰۰۰۰۰۰۳, ۳۶٫۵, ۳۷٫۳۰۰۰۰۰۰۰۰۰۰۰۰۰۴, ۳۷٫۷۹۹۹۹۹۹۹۹۹۹۹۹۹۷]
>>>
map () را می توان به بیش از یک لیست اعمال کرد. لیست ها باید طول یکسان داشته باشند. map () تابع lambda خود را به عناصر لیست های استدلال اعمال می کند، یعنی ابتدا برای عناصر با شاخص ۰، و سپس به عناصر با شاخص اول، تا زمانی که n-th index رسیده است، اعمال می شود:
>>> a = [1,2,3,4]
>>> b = [17,12,11,10]
>>> c = [-1,-4,5,9]
>>> map(lambda x,y:x+y, a,b)
[۱۸, ۱۴, ۱۴, ۱۴]
>>> map(lambda x,y,z:x+y+z, a,b,c)
[۱۷, ۱۰, ۱۹, ۲۳]
>>> map(lambda x,y,z:x+y-z, a,b,c)
[۱۹, ۱۸, ۹, ۵]
ما در مثال بالا می توانیم ببینیم پارامتر x مقادیر خود را از لیست a می گیرد، در حالی که y مقدار آن را از b و z از لیست c دریافت می کند.
تابع (filter(function, list یک روش عالی برای فیلتر کردن تمام عناصر یک لیست ارائه می دهد که عملکرد تابع True را برمیگرداند. تابع( filter(f,l به عنوان اولین پارامتر، تابع f را نیاز دارد. f یک مقدار بولین، یعنی درست یا غلط، را برمیگرداند. این تابع به هر عنصر لیست l اعمال خواهد شد. تنها اگر f return True عنصر لیست را در لیست نتیجه قرار دهد.
>>> fib = [0,1,1,2,3,5,8,13,21,34,55]
>>> result = filter(lambda x: x % 2, fib)
>>> print (result)
[۱, ۱, ۳, ۵, ۱۳, ۲۱, ۵۵]
>>> result = filter(lambda x: x % 2 == 0, fib)
>>> print( result)
[۰, ۲, ۸, ۳۴]
>>>
توسط تابع (reduce(func, seq، تابع func روی دنباله seq پیوسته اعمال میکند و آن را کاهش میدهد.
>>> reduce(lambda x,y: x+y, [47,11,42,13])
۱۱۳