Страницы

Поиск по вопросам

среда, 31 октября 2018 г.

Зачем нужны Lambda-функции?

Изучая 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))
показывает, что действительно создается новая функция, без обмана.

Комментариев нет:

Отправить комментарий