Що таке лямбда-функції?
У Python функції є об’єктами: їх можна призначати змінним, їх можна повертати з інших функцій, зберігати в списках або dicts і передавати як параметри для інших функцій. Розглянемо, наприклад, map()
вбудована функція. Його синтаксис такий map(function, iterable)
і він використовується для зручного застосування function
до кожного елемента iterable
.
map()
фактично повертаєiterator
об'єкт. На практиці ми представляємо результат як alist
,tuple
,set
,dict
, і т.д., як зручніше.
Припустімо, що ви хочете звести в квадрат кожен член списку за допомогоюmap()
функція. Щоб зробити це, ми визначимо asquare()
і використовуйте її як параметр для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]
У Python lambda
функції — це анонімні функції, які отримали назву та синтаксис від Алонзо Черча Лямбда-числення. Їх синтаксис:
lambda x_1,..., x_n : expression(x_1, ..., x_n)
Це створює анонімну функцію, яка отримує як вхідні дані змінні x_1, ..., x_n
і повертає оцінений expression(x_1, ..., x_n)
.
Мета lambda
functions слід використовувати як параметр для функцій, які приймають функції як параметр, як ми робили з map()
вище. Python дозволяє призначати 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__)
Навіщо використовувати лямбда-функції?
Після останнього абзацу ви можете запитати, чому ви хочете використовувати a lambda
функція. Зрештою, все, що можна зробити з a lambda
функцію можна виконати за допомогою іменованої функції.
Відповідь на це така lambda
функції мета це жити всередині більших виразів, що представляють обчислення. Один із способів подумати про це — за аналогією зі змінними та значеннями. Розглянемо наступний код:
x = 2
Змінна x
є заповнювачем (або назвою) для цілого числа 2
. Наприклад, телефонувати print(x)
та print(2)
дає точно такий же результат. У випадку функцій:
def square(x): return x**2
Функція square()
є заповнювачем для обчислення зведення числа в квадрат. Це обчислення можна записати безіменним способом як lambda x: x**2
.
Після цього філософського відступу давайте подивимося кілька прикладів застосування для lambda
функції.
Використання лямбда з функцією sorted().
Команда sorted()
функція сортує ітерацію. Він приймає функцію як свою key
аргумент, а результат функції, застосованої до кожного елемента iterable, використовується для впорядкування елементів.
Це ідеально підходить для a 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()».
Команда filter()
функція має такий синтаксис: filter(function, iterable)
і виводить елементи iterable
які оцінюють function(element)
як істинне (схоже на an 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()
синтаксис функції: map(function, iterable)
та map()
застосовується function
до кожного елемента iterable
, повертаючи a map
об’єкт, до якого можна отримати доступ шляхом приведення до a list
.
Ми бачили, як це можна застосувати до списків, але це можна застосувати до dicts за допомогою 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 з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди 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
функції в Python. Ми це бачили lambda
функції є анонімними функціями, які використовуються як вбудований параметр функції для інших функцій. Ми бачили деякі випадки використання, а також коли їх не варто використовувати.
Під час програмування важливо пам’ятати цитату Дональда Кнута: «Програми призначені для читання людьми і лише випадково для виконання комп’ютерами». Маючи це на увазі, lambda
Функції є корисним інструментом для спрощення нашого коду, але використовувати їх потрібно з розумом.