توابع لامبدا در پایتون

توابع لامبدا چیست؟


در پایتون، توابع اشیاء هستند: آنها را می توان به متغیرها نسبت داد، می توان آنها را از توابع دیگر برگرداند، در لیست ها یا دیکت ها ذخیره کرد و به عنوان پارامتر برای توابع دیگر ارسال کرد. به عنوان مثال، را در نظر بگیرید 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**2def named_square(x): return x**2print(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 توابع ابزاری مفید برای ساده سازی کد ما هستند ، اما باید عاقلانه استفاده شود.

تمبر زمان:

بیشتر از Stackabuse