Перейти к содержанию

Начало урока

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
lambda содержит ровно одно выражение. В ней нет ключевого слова 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]

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя