توابع لامبدا چیست؟
در پایتون، توابع اشیاء هستند: آنها را می توان به متغیرها نسبت داد، می توان آنها را از توابع دیگر برگرداند، در لیست ها یا دیکت ها ذخیره کرد و به عنوان پارامتر برای توابع دیگر ارسال کرد. به عنوان مثال، را در نظر بگیرید map()
عملکرد داخلی نحو آن است map(function, iterable)
و از آن برای اعمال دستی استفاده می شود function
به هر عنصر از iterable
.
map()
در واقع یک را برمی گرداندiterator
هدف - شی. در عمل، ما نتیجه را به صورت a میزنیمlist
,tuple
,set
,dict
و غیره، هر کدام راحت تر است.
فرض کنید که می خواهید هر اصطلاح یک لیست را با استفاده از این لیست مربع کنیدmap()
تابع. برای انجام این کار، a را تعریف می کنیمsquare()
تابع و از آن به عنوان پارامتر برای استفاده کنیدmap()
:
my_list = [1,2,3,4,5]
def square(x):
return x**2
my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]
با این حال، اگر تنها استفاده از ما square()
تابع ایجاد این لیست است، استفاده از a تمیزتر است lambda
عملکرد:
my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]
در پایتون، lambda
توابع توابع ناشناس هستند که نام و نحو خود را از آلونزو چرچ گرفته اند حساب لامبدا. نحو آنها این است:
lambda x_1,..., x_n : expression(x_1, ..., x_n)
این یک عملکرد ناشناس ایجاد می کند که به عنوان متغیرها وارد می شود x_1, ..., x_n
و ارزیابی شده را برمی گرداند expression(x_1, ..., x_n)
.
هدف از lambda
توابع به عنوان پارامتر برای توابع که توابع را به عنوان پارامتر می پذیرند ، استفاده می شود ، همانطور که با ما انجام دادیم map()
در بالا. پایتون به شما این امکان را می دهد که a را اختصاص دهید lambda
تابع یک متغیر است، اما راهنمای سبک PEP 8 توصیه به مخالفت می کند اگر می خواهید یک تابع ساده را به یک متغیر اختصاص دهید، بهتر است آن را به صورت یک تعریف یک خطی انجام دهید. این اطمینان حاصل می کند که شی حاصل به درستی نامگذاری شده است و خوانایی ردیابی را بهبود می بخشد:
anonymous_square = lambda x : x**2
def named_square(x): return x**2
print(anonymous_square.__name__)
print(named_square.__name__)
a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)
چرا از توابع لامبدا استفاده کنیم؟
بعد از پاراگراف آخر ، ممکن است تعجب کنید که چرا می خواهید از lambda
تابع. پس از همه، هر کاری که می توان با a انجام داد lambda
تابع را می توان با یک تابع نامگذاری شده انجام داد.
پاسخ این است که lambda
کارکرد هدف زندگی در عبارات بزرگتر است که نمایانگر یک محاسبات است. یکی از راه های فکر کردن در مورد این ، قیاس با متغیرها و ارزش ها است. کد زیر را در نظر بگیرید:
x = 2
متغیر x
جای جای (یا نام) برای عدد صحیح است 2
. به عنوان مثال، تماس گرفتن print(x)
و print(2)
دقیقا همان خروجی را می دهد. در مورد توابع:
def square(x): return x**2
تابع square()
یک مکان نگهدار برای محاسبه مربع کردن یک عدد است. این محاسبات را می توان به صورت بی نام نوشت lambda x: x**2
.
به دنبال این انحراف فلسفی، بیایید چند نمونه از کاربردها را ببینیم lambda
توابع.
استفاده از Lambda با تابع sorted().
La sorted()
تابع یک تکرار شونده را مرتب می کند. تابعی را به عنوان خود می پذیرد key
آرگومان، و نتیجه تابع اعمال شده برای هر عنصر تکرارپذیر برای ترتیب دادن عناصر استفاده می شود.
این کاملا برای یک مناسب است lambda
تابع: با تنظیم key
پارامتر با a lambda
عملکرد ، ما می توانیم با هر نوع ویژگی عناصر مرتب شویم. به عنوان مثال ، می توانیم لیستی از نام ها را با نام خانوادگی مرتب کنیم:
name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']
استفاده از Lambda با تابع "filter()".
La filter()
تابع دارای نحو زیر است: filter(function, iterable)
و خروجی عناصر از iterable
که ارزیابی می کنند function(element)
درست است (شبیه یک است WHERE
بند در SQL). ما میتوانیم استفاده کنیم lambda
به عنوان پارامتر برای filter()
برای انتخاب عناصر از یک تکرار شونده
به مثال زیر توجه کنید:
num_list = list(range(0,100))
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]
filter()
اعمال می کند lambda
تابع lambda x: (x % 3 == 0) and (x % 5 == 0)
به هر عنصر از range(0,100)
، و a را برمی گرداند filter
هدف - شی. ما با ریختن آن به عنوان به عناصر دسترسی پیدا می کنیم list
.
استفاده از Lambda با تابع نقشه ()
آخرین مثال ما چیزی است که در مقدمه دیده ایم - map()
تابع. map()
نحو تابع عبارت است از: map(function, iterable)
و map()
اعمال میشود function
به هر عنصر از iterable
، بازگشت الف map
شیئی که با ریخته گری به a قابل دسترسی است list
.
ما دیدهایم که چگونه میتوان این را در لیستها اعمال کرد، اما میتوان آن را با استفاده از دیکتهها اعمال کرد dict.items()
روش:
my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb
یا به یک رشته:
my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'
راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
ما می توانید استفاده کنید map()
عملکرد به روش های مبتکرانه - یک مثال اعمال بسیاری از توابع برای یک ورودی است.
برای مثال، فرض کنید در حال ساخت یک API هستید که یک رشته متنی را دریافت می کند و می خواهید لیستی از توابع را روی آن اعمال کنید.
هر تابع برخی از ویژگی ها را از متن استخراج می کند. ویژگی هایی که می خواهیم استخراج کنیم تعداد کلمات ، کلمه دوم و حرف چهارم کلمه چهارم است:
def number_of_words(text):
return len(text.split())
def second_word(text):
return text.split()[1]
def fourth_letter_of_fourth_word(text):
return text.split()[3][3]
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
feature_list = list(map_obj)
print(feature_list)
[5, 'had', 't']
نتیجه
در این راهنما، ما عملکرد آن را بررسی کرده ایم lambda
توابع در پایتون ما آن را دیده ایم lambda
توابع توابع ناشناس هستند که به عنوان پارامتر تابع درون خطی برای سایر توابع استفاده می شوند. ما برخی موارد استفاده و همچنین زمان عدم استفاده از آنها را دیدهایم.
هنگام برنامه نویسی، مهم است که نقل قول دونالد کنوت را در نظر داشته باشید: "برنامه ها برای خواندن انسان ها و فقط به صورت تصادفی برای رایانه ها ساخته شده اند تا اجرا شوند." با داشتن این نکته در ذهن، lambda
توابع ابزاری مفید برای ساده سازی کد ما هستند ، اما باید عاقلانه استفاده شود.