Функция, которую не утрудился назвать
Большинство функций в Python определяют через def, дают им имена и хранят в файлах, где их можно переиспользовать. lambda — маленькая безымянная альтернатива, полезная в тех редких случаях, когда полноценная функция была бы церемонией не по масштабу.
Вот форма рядом:
Две функции, делают ровно то же самое. Lambda-версия умещается в одну строку, потому что это в принципе её работа: одноразовая функция для одноразового момента.
Синтаксис
lambda <params>: <expression>
<params>— такой же список параметров, как уdef: поддерживает значения по умолчанию,*args,**kwargs.<expression>— одно выражение, значение которого становится возвращаемым значением.
Примеры:
Ключевого слова return нет. Значение выражения возвращается неявно.
Главное ограничение
В lambda может быть только одно выражение. Инструкции туда вставить нельзя:
Но тернарник использовать можно:
Если нужно больше одного выражения — это подсказка переключиться на def.
Где lambda реально оправдывает себя
Lambda, присвоенная переменной, почти всегда хуже именованного def:
Это строго хуже, чем def double(x): return x * 2 — та же читаемость, плюс lambda-версия даёт отладчикам бесполезное имя <lambda> в стек-трейсах.
Lambda блестит ровно в одном месте — как встроенный аргумент функции высшего порядка.
Свой ключ сортировки
Классический случай:
Аргумент key у sorted хочет функцию, принимающую элемент и возвращающую значение для сортировки. Однострочная lambda — идеальный выбор; полный def для такой мелочи ощущался бы тяжеловесно.
По нескольким полям сортируют через кортеж:
min, max, filter, map
Похожая история — все они принимают опциональный функциональный аргумент:
Для map и filter списковое включение обычно ещё яснее:
Поэтому большинство питонистов предпочитают включения перед map/filter. lambda остаётся естественной для sorted, min и max, где у включений нет короткого пути.
Lambda и operator
Когда твоя lambda — это просто «достать ключ» или «достать атрибут», в модуле operator есть более быстрые и чистые альтернативы:
Выигрыш небольшой, но в коде, где operator уже импортирован, читается чуть декларативнее.
Когда возвращаться к def
Если верно хоть одно — пиши def:
- Логика не укладывается чисто в одно выражение.
- Ты хотел бы назвать функцию, потому что имя улучшит читаемость.
- Ты бы использовал ту же логику больше, чем в одном месте.
- Функции нужен docstring (у lambda его быть не может).
Помни: Python не оценивают по количеству строк. Трёхстрочная именованная функция почти всегда читается лучше однострочной lambda, когда логика нетривиальна.
Дальше: декораторы
Lambda передаёт функции как значения. Декораторы поднимают ту же идею ещё выше: позволяют обернуть любую функцию переиспользуемым поведением — логированием, таймингом, кэшированием, авторизацией — одним @ строкой выше. Об этом следующая страница.
Часто задаваемые вопросы
Что такое lambda в Python?
lambda — это короткая анонимная функция, которую можно записать в одну строку. lambda x: x * 2 эквивалентно def double(x): return x * 2, только без имени. Полезнее всего, когда нужна крошечная функция в виде аргумента другой функции.
Когда использовать lambda вместо def?
Используй lambda для одноразовых функций из одного выражения, которые ты передаёшь напрямую в sorted, max или filter. Для чего-то с телом длиннее одного выражения — или чего-то, что ты хотел бы назвать, — используй def. Именованные функции почти всегда яснее.
Каковы ограничения lambda?
В lambda может быть только одно выражение, не инструкции. Никаких присваиваний, никаких блоков if (хотя можно тернарный a if cond else b), никакой многострочной логики. Борешься с этими ограничениями — переключайся на def.