Lambda, map, filter, reduce
Крошечные анонимные функции и функциональное трио для преобразования данных
lambda — это маленькая безымянная функция, записанная в одну строку. map, filter и reduce — это функции высшего порядка: они принимают другую функцию и применяют её ко всей последовательности, чтобы преобразовать её, отобрать из неё элементы или свернуть её в одно значение.
- писать
lambdaи понимать, когда это оправдано, а когда нет, - преобразовывать каждый элемент последовательности с помощью
map, - оставлять только нужные элементы с помощью
filter, - сворачивать последовательность в одно значение с помощью
functools.reduce, - взвешивать компромисс читаемости против генератора списка или обычного цикла.
1. Что такое lambda?
lambda — это анонимная функция: функция без имени, определённая прямо там, где она нужна. Синтаксис: ключевое слово lambda, затем параметры, двоеточие и одно выражение, значение которого возвращается автоматически.
double = lambda x: x * 2
print(double(5)) # 10
Эта lambda в точности эквивалентна такой именованной функции:
def double(x):
return x * 2
lambda может принимать несколько параметров через запятую:
add = lambda a, b: a + b
print(add(3, 4)) # 7
return (результат возвращается за вас), и в неё нельзя поместить присваивания, циклы или несколько инструкций. Когда это нужно — используйте def.2. map: преобразовать каждый элемент
map(function, iterable) применяет function к каждому элементу и выдаёт результаты. В Python 3 возвращается ленивый итератор (объект map), поэтому обычно его оборачивают в list(), чтобы увидеть значения.
nums = [1, 2, 3, 4]
squares = list(map(lambda n: n * n, nums))
print(squares) # [1, 4, 9, 16]
Функция не обязана быть lambda — подойдёт любой вызываемый объект, включая встроенные:
prices = ["10", "25", "7"]
as_int = list(map(int, prices))
print(as_int) # [10, 25, 7]
map может проходить сразу по нескольким последовательностям; тогда функция получает по одному аргументу из каждой:
a = [1, 2, 3]
b = [10, 20, 30]
sums = list(map(lambda x, y: x + y, a, b))
print(sums) # [11, 22, 33]