map, filter и lambda
map, filter и lambda
map — применить функцию ко всем
map применяет функцию к каждому элементу последовательности. Самое частое применение — превратить список строк в список чисел:
1 2
Результат оборачиваем в list(), чтобы увидеть значения.
filter — оставить подходящие
1 2 3
lambda — функция без имени
lambda создаёт функцию прямо в том месте, где она нужна, не давая ей имени. Отсюда и название — анонимная функция.
Общий вид записи:
1
Слева от двоеточия — параметры (как в скобках у def), справа — одно выражение, значение которого возвращается автоматически. Слово return не пишется: его там просто нет.
Эти две записи делают ровно одно и то же:
1 2 3 4
Аргументов может быть сколько угодно
1 2 3 4
Ветвление внутри lambda
Обычный if — это инструкция, внутрь lambda он не помещается. Зато помещается тернарный оператор — он является выражением:
1 2
Что lambda не умеет
| Можно | Нельзя |
|---|---|
| одно выражение | несколько строк кода |
| тернарный if ... else ... | обычные if:, for:, while: |
| вызов других функций | присваивание переменной |
| вернуть кортеж, список, словарь | return и print как инструкции |
Как только логика перестаёт помещаться в одну строку — пиши обычный def. Это не хуже, а на экзамене читается понятнее.
Зачем она нужна: функция как аргумент
Главный смысл lambda в том, что функцию можно передать внутрь другой функции. sorted, max, min, filter принимают параметр key — функцию, которая говорит, по чему сравнивать:
1 2 3
Ради такой одноразовой функции заводить отдельный def и придумывать ей имя не хочется — для этого lambda и придумали. Подробно про сортировку по нескольким критериям — в статье «Сортировка по ключу: sorted, key, lambda».
Иногда lambda не нужна вовсе: если подходящая функция уже существует, передавай её саму.
1 2
То же через генератор
Почти всё, что делают map и filter, можно записать списочным выражением — многим так понятнее:
| Через функцию | Через генератор |
|---|---|
| list(map(int, parts)) | [int(x) for x in parts] |
| list(filter(lambda x: x > 0, a)) | [x for x in a if x > 0] |
