توابع ناشناس گاهی اوقات میخواهیم یک شی ساده قابل فراخوانی برای پاس دادن به تابع بدون ایجاد سرباری که def ایجاد میکنند بسازیم. در این مواقع به توابع ناشناس (lambda function) نیاز پیدا میکنیم. توابع ناشناس توابعی کوچکی هستند که میتوانند هر تعداد ورودی (arguments) داشته باشند ولی تنها یک عبارت (expression) را خروجی میدهند. البته میتوان چندین عبارت را در قالب یک چندتایی یا لیست خروجی داد.
lambda argumets : expression lambdaargumets:expression
این توابع معمولا یکبار مصرف هستند که باعث کوتاهتر شدن کد میشوند البته باید توجه داشت که استفاده بیشاز حد از توابع ناشناس باعث ابهام در کد میشود. برای اطلاعات بیشتر در مورد تاریخچه جبر lambda به این لینک مراجعه کنید.
چرا ناشناس؟ میتوان بدون نامگذاری این توابع از آنها استفاده نمود. البته مانند توابع ساده خود پایتون میتوان توابع ناشناس را درون یک متغیر ریخته که صدا زدن آن متغیر همانند صدا زدن تابع ناشناس میباشد. توجه داشته باشید همانطور که گفتیم این تابع میتواند چندین ورودی داشته باشد. برای درک این مفاهیم به مثال زیر دقت کنید.
>>> (lambda x: x * x)(2)
4
>>> power_two = lambda x: x * x
>>> power_two(2)
4
>>> average = lambda a, b: (a + b) / 2
>>> average(20, 18)
19.0
>>> statistic = lambda a, b: [(a + b) / 2, max(a, b)]
>>> statistic(20, 18)
[19.0, 20]
کاربردهای توابع ناشناس رایجترین استفاده از تابعهای لامبدا در کدهایی است که نیازمند توابع یکخطی سادهای هستند و نوشتن یک تابع معمولی کامل، زیاده کاری محسوب میشود.
>>> mylist = [(1,3),(4,5),(2,10),(9,6)]
>>> mylist.sort()
>>> mylist
[(1, 3), (2, 10), (4, 5), (9, 6)]
>>> mylist.sort(key = lambda x: x[-1])
>>> mylist
[(1, 3), (4, 5), (9, 6), (2, 10)]
قدرت lambda زمانی بهتر نشان داده میشود که از آنها به عنوان توابع ناشناس در درون توابع دیگر استفاده کنید.
>>> def myfunc(n):
return lambda a : a * n
>>> mydoubler = myfunc(2)
>>> mytripler = myfunc(3)
>>>
>>> mydoubler(11)
22
>>> mytripler(11)
33