Глава 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, без установки