Модуль 6 · Функции и модули

Справочник по Python · модуль 6 · функции и модули

Глава 6.9

6.9

Lambda-функции

lambda создаёт короткую функцию из одного выражения. Обычно её передают прямо в sorted(), map() или filter(), когда отдельное имя не сделает код понятнее.

Категория
Функции
Уровень
Средний
Связанные темы
def, return, map, filter, sorted
Зачем это знать
Кратко передавать простое правило вычисления

§1Что создаёт lambda

Lambda-функция — функция без имени в самой записи. Ключевое слово lambda перечисляет параметры, а выражение после двоеточия становится возвращаемым результатом.

Название происходит от λ-исчисления — математической системы для описания функций. Для использования синтаксиса Python знать её не требуется.

§2Синтаксис

Схемаreturn пишется неявно
lambda параметры: выражение
       │             └─ результат функции
       └─────────────── входные значения

После двоеточия допускается одно выражение. Его значение автоматически возвращается вызывающему коду.

§3Сравнение с def

main.pyдве одинаковые функции
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Несколько параметров

До двоеточия можно перечислить несколько параметров через запятую.

main.pyсложение двух аргументов
add = lambda left, right: left + right
print(add(3, 4))
Вывод3 + 4
7

§5Прямой вызов

Lambda-выражение можно заключить в скобки и сразу вызвать. Такой пример показывает, что конструкция действительно создаёт функцию, хотя в обычной программе чаще встречается передача функции аргументом.

main.pyсоздание и вызов на месте
print((lambda number: number * 2)(5))
Выводудвоенное число
10

§6Сортировка по ключу

Lambda удобна, когда ключ нужно извлечь из сложного элемента. В примере функция получает кортеж и возвращает его второй элемент.

main.pyсортировка по баллу
results = [("Анна", 3), ("Борис", 5), ("Вера", 4)]
ordered = sorted(results, key=lambda item: item[1], reverse=True)
print(ordered)
Выводпо убыванию второго элемента
[('Борис', 5), ('Вера', 4), ('Анна', 3)]

§7Lambda с map()

map() вызывает переданную lambda-функцию для каждого числа.

main.pyудвоение элементов
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() выражение должно отвечать, оставлять ли элемент.

main.pyзначения больше десяти
numbers = [5, 10, 15, 20]
result = list(filter(lambda number: number > 10, numbers))
print(result)
Выводдва элемента прошли условие
[15, 20]

§9Условное выражение внутри lambda

Обычные операторы if и else требуют блоков кода и не помещаются в lambda. Тернарное выражение остаётся одним выражением, поэтому допустимо.

main.pyклассификация букв
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 + 1SyntaxError: между параметрами и выражением нужно двоеточиеlambda x: x + 1
lambda x: return x + 1SyntaxError: return внутри lambda не пишетсяlambda x: x + 1
lambda x: y = x + 1SyntaxError: присваивание не является допустимым выражениемсоздать обычную функцию через 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: expression
Несколько параметровlambda x, y: expression
Ключ сортировкиsorted(items, key=lambda x: ...)
Условный результатlambda x: a if test else b

Итог главы

lambda создаёт функцию из одного выражения и автоматически возвращает его значение. Она удобна для короткого одноразового правила рядом с sorted(), map() или filter(). Повторно используемую и сложную логику лучше оформлять через def.

Глава 6.9 · Lambda-функции · Справочник по PythonАвтор: Макаров Максим Николаевич