Lambda-функции в Python
Lambda-функции в Python — это однострочные анонимные функции, которые отличаются от обычных своей компактностью, но имеют некоторые ограничения.
В этой статье мы разберём следующие нюансы:
Краткий экскурс в lambda
Понятие lambda существует не только в Python: оно также присутствует в Java, C#, C++ и других языках. Пришла же данная концепция ещё из математического исчисления.
Впервые вопрос лямбд был затронут ещё в 1930-х годах. В это время американский математик и логик Алонзо Чёрч формализовал лямбда-исчисление, благодаря чему получил широкую известность (тезис Чёрча — Тьюринга). Функциональные языки как раз основаны на математической логике и лямбда-исчислении, при этом ключевые языки программирования используют модель Алана Тьюринга. Модель Тьюринга и лямбда-исчисление можно перевести в одну расчётную модель, а суждение о данной эквивалентности и носит название тезиса Чёрча — Тьюринга.
Haskell, Lisp и прочие функциональные языки программирования делают акцент на лямбда-исчислении, в то время как Python, C и им подобные ЯП больше следуют императивному программированию.
Изначально Python не относился к числу функциональных языков, но впоследствии начал использовать некоторые функциональные концепции.
Что такое lambda-функция
lambda-функции — это анонимные функции в Python. Они похожи на обычные функции, но за одним исключением: для определения им не требуются ни ключевое слово def
, ни имя.
Для определения анонимных функций используется ключевое слово lambda
Если сравнить два способа создания функций, то можно выделить следующие моменты:
- lambda-функции занимают лишь одну строчку, возвращаемый результат фиксируется прямо в этой строке. А в обычных функциях выделяют отдельный блок кода (тело функции), в котором и прописаны все нужные действия (любое количество строк).
- lambda-функции состоят из одной строки и их можно вызвать прямо при создании. А обычные функции вызываются только отдельной операцией после объявления. В т.ч. поэтому в среднем lambda-функции исполняются быстрее.
x = lambda x, y : x * y print(x(3, 4)) # 12
x = (lambda x, y : x * y) (2, 3) print(x) # 6
На приведённых выше примерах мы видим lambda-функцию, которая возвращает произведение переменных x
и y
. В первом случае x
ссылается на саму функцию, а во втором же случае переменная x
будет хранить в себе результат вызова этой анонимной функции.
Ключевое слово для создания — lambda.
Параметры —x
иy
.
Выражение —x * y
.
Мы можем передать аргументы функции, поместив функцию и её аргумент в круглые скобки:
x = (lambda x,y : x * y) (2, 3) print(x) # 6
При этом lambda-функцию без проблем можно вызвать и без присваивания в переменную:
print((lambda x, y: x * y)(3, 5)) # 15
Как применять lambda-функции
Давайте рассмотрим несколько примеров.
Для начала напишем программу для вычисления показателя степени с помощью lambda-функции.
exp = (lambda x, y : x ** y) (4, 4) print(exp) # 256
Теперь рассмотрим другой пример:
name = "Меня зовут Олег Булыгин" lambda name: print(name) # <function __main__.<lambda>(name)>
Для начала проанализируем код:
- Была определена переменная
name
(это строка). - Далее прописана lambda-функция, которая должна выводить результат.
- Но корректного результата мы не получаем.
Так происходит потому, что lambda-функция является function-объектом, а в коде выше мы просто получаем область в памяти, где он расположен. Мы её здесь не вызываем, поэтому и не получаем результат исполнения функции.
print((lambda name: print(name))(name)) # Меня зовут Олег Булыгин # None
Теперь почти верно, но мы ещё видим лишний None
после текста. В этом случае само выражение в lambda-функции делает корректный вывод текста на экране, а внешний print
выводит на экран то, что возвращает lambda-функция (а она ничего не возвращает, в ней только print
).
name = "Меня зовут Олег Булыгин" print((lambda name: name)(name)) # Меня зовут Олег Булыгин (lambda name: print(name))(name) # Меня зовут Олег Булыгин
Теперь наш результат правильный, и даже двумя разными способами (с выводом на экран того, что функция возвращает и вызов print
в самой lambda-функции).
А как бы выглядел способ через объявление обычной функции?
name = "Меня зовут Олег Булыгин" def print_line(name): print(name) print_line(name) # Меня зовут Олег Булыгин
Какой способ вам кажется проще?
Когда стоит избегать использования lambda-функций
lambda — это хорошо, но очень важно понимать, когда стоит избегать их использования.
Если вызов функции вам нужен многократно, то логично не использовать анонимную функцию, а создать функцию со своим именем, по которому вы её многократно будете вызывать в нужных местах программы.
Кроме того, если lambda-функция приводит к тому, что страдает читаемость кода, то также стоит подумать о стандартном способе создания функций.
Альтернативы
Данные инструменты являются лучшей альтернативой lambda-функциям, если задача состоит в том, чтобы создать список или словарь по определённому алгоритму. Но и о функциях высшего порядка, таких какmap()
, reduce()
и filter()
также не стоит забывать, некоторые задачи с ними будут решаться не менее элегантно.
Источник: Medium