Лямбда-функция — это анонимная (безымянная) функция, определяемая с помощью ключевого слова lambda. Она обычно используется там, где нужна короткая функция "один раз и по месту".
add = lambda x, y: x + y print(add(1, 2)) # 3
Ограничения лямбда-функций:
Когда лямбда полезна:
sorted, filter, map).Когда от лямбда лучше отказаться:
Вопрос: Могут ли лямбда-функции использовать переменные из внешнего скоупа, и как это влияет на их поведение при работе внутри циклов?
Ответ: Лямбда-функции могут захватывать переменные из внешнего контекста (лексическое замыкание). При определении внутри цикла это часто приводит к неожиданному поведению — лямбда использует текущее значение переменной к моменту вызова, а не то, что "было на момент определения".
funcs = [] for i in range(3): funcs.append(lambda: i) # все функции вернут 2 (i=2 после цикла) print([f() for f in funcs]) # [2, 2, 2]
Чтобы захватить "старое" значение:
funcs = [] for i in range(3): funcs.append(lambda i=i: i) print([f() for f in funcs]) # [0, 1, 2]
История
В проекте использовали лямбду для фильтрации списка словарей по определенному ключу. Лямбда внутри цикла захватывала переменную, которая к моменту вызова имела другое (неожиданное) значение. Итог — неправильная фильтрация и ошибки в отчетности.
История
Большой проект на Django: сложная форма валидации, реализованная как длинное выражение внутри лямбда-функции. Впоследствии бизнес-логика изменилась, лямбда перестала вмещать весь код, пришлось переписывать на обычную функцию. Лямбда замедлила отладку.
История
В одном стартапе неудачно применили лямбда для передачи функции сортировки, забыв что она возвращает некорректный тип (например, не кортеж, а список). Это приводило к непредсказуемой сортировке и багам с дедупликацией данных.