Menu
Русский

Python lambda: анонимные функции, sort key и map/filter

Что такое lambda, для чего она хороша и в каких немногих местах она реально оправдывает себя — и когда лучше взять именованную функцию.

Функция, которую не утрудился назвать

Большинство функций в Python определяют через def, дают им имена и хранят в файлах, где их можно переиспользовать. lambda — маленькая безымянная альтернатива, полезная в тех редких случаях, когда полноценная функция была бы церемонией не по масштабу.

Вот форма рядом:

main.py
Output
Click Run to see the output here.

Две функции, делают ровно то же самое. Lambda-версия умещается в одну строку, потому что это в принципе её работа: одноразовая функция для одноразового момента.

Синтаксис

lambda <params>: <expression>

  • <params> — такой же список параметров, как у def: поддерживает значения по умолчанию, *args, **kwargs.
  • <expression> — одно выражение, значение которого становится возвращаемым значением.

Примеры:

main.py
Output
Click Run to see the output here.

Ключевого слова return нет. Значение выражения возвращается неявно.

Главное ограничение

В lambda может быть только одно выражение. Инструкции туда вставить нельзя:

main.py
Output
Click Run to see the output here.

Но тернарник использовать можно:

main.py
Output
Click Run to see the output here.

Если нужно больше одного выражения — это подсказка переключиться на def.

Где lambda реально оправдывает себя

Lambda, присвоенная переменной, почти всегда хуже именованного def:

main.py
Output
Click Run to see the output here.

Это строго хуже, чем def double(x): return x * 2 — та же читаемость, плюс lambda-версия даёт отладчикам бесполезное имя <lambda> в стек-трейсах.

Lambda блестит ровно в одном месте — как встроенный аргумент функции высшего порядка.

Свой ключ сортировки

Классический случай:

main.py
Output
Click Run to see the output here.

Аргумент key у sorted хочет функцию, принимающую элемент и возвращающую значение для сортировки. Однострочная lambda — идеальный выбор; полный def для такой мелочи ощущался бы тяжеловесно.

По нескольким полям сортируют через кортеж:

main.py
Output
Click Run to see the output here.

min, max, filter, map

Похожая история — все они принимают опциональный функциональный аргумент:

main.py
Output
Click Run to see the output here.

Для map и filter списковое включение обычно ещё яснее:

main.py
Output
Click Run to see the output here.

Поэтому большинство питонистов предпочитают включения перед map/filter. lambda остаётся естественной для sorted, min и max, где у включений нет короткого пути.

Lambda и operator

Когда твоя lambda — это просто «достать ключ» или «достать атрибут», в модуле operator есть более быстрые и чистые альтернативы:

main.py
Output
Click Run to see the output here.

Выигрыш небольшой, но в коде, где operator уже импортирован, читается чуть декларативнее.

Когда возвращаться к def

Если верно хоть одно — пиши def:

  1. Логика не укладывается чисто в одно выражение.
  2. Ты хотел бы назвать функцию, потому что имя улучшит читаемость.
  3. Ты бы использовал ту же логику больше, чем в одном месте.
  4. Функции нужен 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.

Учитесь программировать с Coddy

НАЧАТЬ