Анонимная функция: лямбда

Анонимная функция: лямбда

Лямбда-функции в Python являются анонимными. Это означает, что функция безымянна. Как известно, ключевое слов def используется в Python для определения обычной функции. В свою очередь, ключевое слово  lambda  используется для определения анонимной функции.

Лямбда-функция — это короткая однострочная функция, которой даже не нужно имя давать. Такие выражения содержат лишь одну инструкцию, поэтому, например, iffor и while использовать нельзя. Их также можно присваивать переменным:

product = lambda x,y: x*y

В отличие от функций, здесь не используется ключевое слово return. Результат работы и так возвращается.

С помощью type() можно проверить тип:

>>> type(product)
function

На практике эти функции редко используются. Это всего лишь элегантный способ записи, когда она содержит одну инструкцию.

power = lambda x=1, y=2: x**y
square = power
square(5.)
25
power = lambda x,y,pow=2: x**pow + y
[power(x,2, 3) for x in [0,1,2]]
[2, 3, 10]

Изменяемые аргументы по умолчанию

>>> def foo(x=[]):
...     x.append(1)
...     print x
...
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]

Вместо этого нужно использовать значение «не указано» и заменить на изменяемый объект по умолчанию:

>>> def foo(x=None):
...     if x is None:
...         x = []
...     x.append(1)
...     print x
>>> foo()
[1]
>>> foo()
[1]

Различие между обычной функцией и лямбда-функцией

Рассмотрим пример и попробуем понять различие между определением (Def) для обычной функции и lambdaфункции. Этот код возвращает заданное значение, возведенное в куб:

def defined_cube(y):
    return y*y*y


lambda_cube = lambda y: y*y*y
print(defined_cube(2))
print(lambda_cube(2))

Вывод:

8
8

Как показано в примере выше, обе представленные функции, defined_cube() и  lambda_cube(), ведут себя одинаково, как и предполагалось.

Разберем вышеуказанный пример подробнее:

  • Без использования лямбды: Здесь обе функции возвращают заданное значение, возведенное в куб. Но при использовании defнам пришлось определить функцию с именем и defined_cube() дать ей входную величину.  После выполнения нам также понадобилось возвратить результат, из того места, откуда была вызвана функция, и мы сделали это, используя ключевое слово return.
  • С применением лямбды: Определение лямбды не включает оператор returnа всегда содержит возвращенное выражение. Мы также можем поместить определение лямбды в любое место, где ожидается функция, и нам не нужно присваивать его переменной. Так выглядят простые лямбда-функции.