Изучая Python, наткнулся на lambda-функции. Но нигде я пока не нашел примера, где они действительно нужны - только элементарные примеры вида print(lambda x, y: x**2 + y**2), где вполне можно убрать функциональную обертку. Для чего они действительно нужны и полезны?
Ответ
Они не могут быть 100% нужны, то есть без операций сложений написать программу нельзя, без лямбда-функций - можно, но с ними короче и удобней. Например, нужно напечатать словарь в порядке убывания суммы каждого значения:
bigrams = {"AB": [10, 11, 12], "BC": [5, -5, 8], "CD": [105, 1, 0],
"DE": [6, 6], "EF": [15, 20, 15], "FG": [22, 11, 32],
"GH": [20, 20, 20]}
sorter = sorted(bigrams, key=lambda key: sum(bigrams[key]), reverse=True)
for key in sorter:
print(key, bigrams[key])
Иначе нужно написать функцию:
from functools import partial
def sort_func(key, dict):
return sum(dict[key])
bigrams = {"AB": [10, 11, 12], "BC": [5, -5, 8], "CD": [105, 1, 0],
"DE": [6, 6], "EF": [15, 20, 15], "FG": [22, 11, 32],
"GH": [20, 20, 20]}
partial_sort = partial(sort_func, dict=bigrams)
sorter = sorted(bigrams.keys(), key=partial_sort, reverse=True)
for key in sorter:
print(key, bigrams[key])
Результат одинаков, но с лямбдой короче, не нужно искать глазами sort_func - сразу ясно, как именно сортируется коллекция. В стандартной библиотеке полно функций, которые принимают другие функции: map, reduce, filter, sorted, any, all
Можно написать замыкание:
def addition(x):
return lambda y: x + y
add_to_ten = addition(10)
print(add_to_ten(8))
print(add_to_ten(6))
По идее, лямбда функции абсолютно то же самое, что и обычные функции, но без имени:
def func(x):
func = lambda x: x + 1
return 100
import dis
print(dis.dis(func))
показывает, что действительно создается новая функция, без обмана.
Комментариев нет:
Отправить комментарий