61. Анонимные функции: выражения lambda
В предыдущем уроке мы разобрались с аргументами и параметрами функций, а также с операторами *
и **
. Вот и дошли мы до этой темы. Если вы помните, в уроке «Внутреннее устройство и сортировка словаря в Python» я уже упоминал про lambda
. Теперь настало время разобраться с этим понятием подробнее.
Кроме оператора def
, в языке Python есть еще одна форма выражения, создающая объекты функций. Как и def
, лямбда-выражение создает функцию, которая будет вызвана позже. Выражение lambda
, в отличие от def
не имеет имени, поэтому иногда такие функции называют анонимными.
На практике анонимные функции применяются, когда необходимо встроить определение функции в строку или отложить выполнение части кода. Далее синтаксис lambda-выражения:
lambda арг1, арг2, … аргN : выражение
Пока не совсем понятно, поэтому далее приведу конкретные примеры. Но для начала разберемся, чем lambda
отличается от оператора def
. Лямбда – выражение, а не оператор. Таким образом, лямбда-выражение может находится в таких местах, где это недопустимо синтаксисом для оператора def
, например, в аргументах вызова функций (про аргументы и параметры мы подробно разбирались в предыдущем уроке).
Вторым отличием lambda
от def
, является ограниченность первого. Лямбда – одиночное выражение, а не блок операторов. Конечно, можно реализовать ветвление при помощи тернарного оператора и циклы при помощи списковых включений, но такая реализация существенно запутает код и сведет на «нет» все преимущества лямбда-выражения. Если вам нужны ветвления, циклы и более сложная логика, то используйте оператор def
.
Рассмотрим знакомый вам пример использования оператора def
:
def sum(a, b):
return a + b
print(sum(3, 2)) # => 5
А теперь запишем аналогичный пример, но при помощи лямбда-выражения:
f = lambda a, b : a + b
print(f(3, 2)) # => 5
Скоро мы дойдем до встроенных функций filter()
, map()
, reduce()
и вам станет окончательно понятно, для чего необходимо знать лямбда-выражения. Выражение lambda
безусловно полезно для краткого обозначения функции, но не стоит им злоупотреблять и применять там, где требуется вся мощь оператора def
.
Область видимости выражения lambda
Вспомним урок «Область видимости в Python» и правило LEGB. Лямбда относится к букве E – вложенная область.
В этом уроке мы разобрались с тем, что такое лямбда-выражение и чем оно отличается от оператора def
. Все это нас подводит к инструментам функционального программирования (вышеупомянутые функции filter()
, map()
, reduce()
и есть парадигмы функционального программирования в Python).