Справочник по Python · модуль 6 · функции и модули
Глава 6.9
Lambda-функции
lambda создаёт короткую функцию из одного выражения. Обычно её передают прямо в sorted(), map() или filter(), когда отдельное имя не сделает код понятнее.
- Категория
- Функции
- Уровень
- Средний
- Связанные темы
- def, return, map, filter, sorted
- Зачем это знать
- Кратко передавать простое правило вычисления
§1Что создаёт lambda
Lambda-функция — функция без имени в самой записи. Ключевое слово lambda перечисляет параметры, а выражение после двоеточия становится возвращаемым результатом.
Название происходит от λ-исчисления — математической системы для описания функций. Для использования синтаксиса Python знать её не требуется.
§2Синтаксис
lambda параметры: выражение
│ └─ результат функции
└─────────────── входные значенияПосле двоеточия допускается одно выражение. Его значение автоматически возвращается вызывающему коду.
§3Сравнение с def
def square_def(number): return number ** 2 square_lambda = lambda number: number ** 2 print(square_def(4)) print(square_lambda(4))
16 16
Если функции всё равно нужно имя и она используется повторно, запись через def обычно читается лучше. Основная польза lambda — передача короткой функции прямо в место использования.
§4Несколько параметров
До двоеточия можно перечислить несколько параметров через запятую.
add = lambda left, right: left + right print(add(3, 4))
7
§5Прямой вызов
Lambda-выражение можно заключить в скобки и сразу вызвать. Такой пример показывает, что конструкция действительно создаёт функцию, хотя в обычной программе чаще встречается передача функции аргументом.
print((lambda number: number * 2)(5))
10
§6Сортировка по ключу
Lambda удобна, когда ключ нужно извлечь из сложного элемента. В примере функция получает кортеж и возвращает его второй элемент.
results = [("Анна", 3), ("Борис", 5), ("Вера", 4)] ordered = sorted(results, key=lambda item: item[1], reverse=True) print(ordered)
[('Борис', 5), ('Вера', 4), ('Анна', 3)]§7Lambda с map()
map() вызывает переданную lambda-функцию для каждого числа.
numbers = [1, 2, 3, 4] result = list(map(lambda number: number * 2, numbers)) print(result)
[2, 4, 6, 8]
Здесь включение [number * 2 for number in numbers] короче. Lambda становится полезнее, когда интерфейс функции явно ожидает вызываемый аргумент.
§8Lambda с filter()
Для filter() выражение должно отвечать, оставлять ли элемент.
numbers = [5, 10, 15, 20] result = list(filter(lambda number: number > 10, numbers)) print(result)
[15, 20]
§9Условное выражение внутри lambda
Обычные операторы if и else требуют блоков кода и не помещаются в lambda. Тернарное выражение остаётся одним выражением, поэтому допустимо.
letters = "python" types = list(map( lambda letter: "гласная" if letter in "aeiou" else "согласная", letters, )) print(types)
['согласная', 'согласная', 'согласная', 'гласная', 'согласная', 'согласная']
§10Ограничения lambda
- После двоеточия находится только одно выражение.
- Нельзя записать несколько инструкций, присваивание или обычный многострочный
if. - Сложные вложенные условия быстро ухудшают читаемость.
- Для длинной логики нельзя добавить понятные промежуточные шаги.
Одно выражение может переноситься на несколько строк внутри скобок, но от этого lambda не превращается в многооператорную функцию.
§11Когда выбрать def
| Ситуация | Выбор | Причина |
|---|---|---|
| короткий ключ сортировки используется один раз | lambda | правило видно рядом с вызовом |
| функция вызывается в нескольких местах | def | есть понятное имя и одно место для изменений |
| нужны несколько действий или проверки | def | можно использовать блок кода |
| нужны описание и аннотации | def | сигнатура и документация читаются яснее |
§12Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
lambda x = x + 1 | SyntaxError: между параметрами и выражением нужно двоеточие | lambda x: x + 1 |
lambda x: return x + 1 | SyntaxError: return внутри lambda не пишется | lambda x: x + 1 |
lambda x: y = x + 1 | SyntaxError: присваивание не является допустимым выражением | создать обычную функцию через def |
sorted(data, lambda x: x[1]) | TypeError: key — именованный аргумент | sorted(data, key=lambda x: x[1]) |
| длинная lambda с несколькими вложенными условиями | правило трудно прочитать и проверить | дать функции имя и записать через def |
§13Проверьте себя
Что возвращает lambda-функция?
Значение единственного выражения после двоеточия; слово return не пишется.
Почему в key=lambda item: item[1] нет вызова lambda?
sorted() получает функцию и самостоятельно вызывает её для каждого элемента.
Когда лучше заменить lambda на def?
Когда функция повторно используется, содержит сложную логику или нуждается в понятном имени и документации.
§14Шпаргалка
lambda x: expressionlambda x, y: expressionsorted(items, key=lambda x: ...)lambda x: a if test else bИтог главы
lambda создаёт функцию из одного выражения и автоматически возвращает его значение. Она удобна для короткого одноразового правила рядом с sorted(), map() или filter(). Повторно используемую и сложную логику лучше оформлять через def.