Глава 13 · Автоматизация с помощью функций

Лямбда-функции

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

В §13.20 мы передавали len как аргумент в sorted(). А что, если нужное правило сортировки не существует как готовая функция — и заводить ради него отдельный def кажется излишним? Для этого существует lambda.

lambda создаёт маленький безымянный объект функции

lambda_sortirovka.py
students = [{"name": "Anna", "score": 82}, {"name": "Bob", "score": 95}]
students.sort(key=lambda student: student["score"])
Не «более короткий def», а инструмент для конкретной ситуации
Главная задача lambda — передать маленькое правило/преобразование туда, где полноценная именованная функция была бы избыточной. Это НЕ более современная замена def — это отдельный инструмент для узкого случая.

Анатомия lambda

lambda_anatomiya.py
lambda x: x ** 2
ЧастьЗначение
lambdaключевое слово — создать функцию-выражение
xпараметр (без скобок)
x ** 2единственное выражение — его результат возвращается автоматически
lambda_vyzov.py
kvadrat = lambda x: x ** 2
print(kvadrat(5))   # 25

Никакого явного return и никаких блочных инструкций внутри — только одно выражение.

Ограничения lambda

Когда lambda НЕ подходит — берите def
Только выражение
ни одной инструкции
ни присваивания, ни print
Не для сложной логики
ветвление с эффектами
длинные вычисления
Без имени и докстринга
нечего показать в traceback
нечего документировать
Если логика заслуживает имени — используйте def
Как только правило становится достаточно важным, чтобы его стоило переиспользовать, протестировать отдельно или объяснить докстрингом — самое время превратить lambda в обычную функцию с def.

def → lambda: сравнение стиля, а не «улучшение»

Простая функция: def → lambda
Обычная функция (def)
def kvadrat(x):
    return x ** 2

print(kvadrat(5))
Лямбда-функция
kvadrat = lambda x: x ** 2

print(kvadrat(5))
Что использовать сегодня: обычную функцию с def — она читается яснее, у неё есть нормальное имя для отладки, и в неё легко добавить несколько строк логики или комментарий. lambda удобна только для одной короткой строки без имени — например, как аргумент функции sorted() или max(). Присваивание lambda имени (kvadrat = lambda x: ...) не более «современно», чем def — во многих реальных проектах такой стиль сочли бы менее читаемым, а не прогрессивным.

Необязательно: map() и filter()

Раз вы уже знаете comprehensions (глава 11), полезно увидеть их альтернативу:

map_primer.py
numbers = [1, 2, 3, 4]
kvadraty = list(map(lambda n: n ** 2, numbers))
print(kvadraty)
comprehension_ekvivalent.py
numbers = [1, 2, 3, 4]
kvadraty = [n ** 2 for n in numbers]
print(kvadraty)
filter_primer.py
chetnye = list(filter(lambda n: n % 2 == 0, numbers))
comprehension_s_if.py
chetnye = [n for n in numbers if n % 2 == 0]
Python чаще предпочитает comprehensions
Для простых преобразований и фильтров comprehension обычно читается яснее, чем map()/filter() с lambda. Знать оба стиля полезно — вы встретите оба в реальном коде, — но по умолчанию тянитесь к comprehension, если задача простая.
Практика: лямбда-функции
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →