Lambda-функции и функции высшего порядка

Тема дорожной карты · Python Programming

lambda — это анонимная функция из одного выражения, удобная как маленький callback для sorted(key=...), min/max, filter или GUI-обработчика. Всё, что больше одного выражения, оформляй именованным def: в lambda нет statement-ов, аннотаций типов, докстрингов и многострочного тела. Реальная абстракция — функции высшего порядка (которые принимают или возвращают функции): functools.partial для частичного применения, functools.reduce для свёрток, декораторы для cross-cutting concerns. Помни о late-binding closure при создании лямбд в цикле — захватывай значение через дефолтный аргумент.

Как это работает

Lambda-функции и функции высшего порядка использует def name(params): body для объявления функций. Параметры могут быть позиционными, keyword, default-значимыми, variadic (*args, **kwargs) или positional-/keyword-only (PEP 570/3102). return возвращает значение (или None неявно). Функции — first-class объекты: их можно присваивать переменным, передавать как аргументы, возвращать из других функций. lambda — анонимная форма-выражение, полезна в sorted(key=...), map, filter. Скоупинг по LEGB (Local, Enclosing, Global, Built-in).

Когда применять

Выносите функцию когда (а) код повторяется, (б) ему можно дать осмысленное имя, (в) хотите тестировать его изолированно. Предпочитайте чистые функции (без сайд-эффектов, детерминированные) где возможно — они лучше композируются и легче тестируются. *args, **kwargs используйте с осторожностью; явные параметры документируют намерение. lambda хороша как маленький inline-коллбэк; для чего-то большего — def с именем.

Типичные ошибки

Ловушки Lambda-функции и функции высшего порядка: изменяемые значения по умолчанию (def f(x=[]): — список общий между вызовами; используйте x=None и инициализируйте внутри); затенение встроенных имён локальными (list = [1,2] потом list(...) ломается); изменение глобального состояния вместо возврата значения (нетестируемо, неожиданно на расстоянии); глубоко вложенные замыкания, захватывающие переменные цикла по ссылке, не по значению. Сигнатуры — короткие и явные.

Связанные понятия

Полезные ресурсы