Lambda функции в Python

Lambda/Лямбда – функция в Питон, которая определяется без имени. Как правило, функции определяем через ключевое слово def. При этом лямбда определяется посредством одноименного ключевого слова.
Данная функция возвращает сумму 2-х аргументов: lambda a, b: a + b. При этом лямбда-функции можно применять, где нужны функциональные объекты. Они синтаксически ограничены одним выражением.
Семантически, они представляют собой синтаксический сахар для нормального определения функции.

deffunc(a,b):
returna+b

# равноценно
f=lambdaa,b:a+b

a=5
b=4
print(func(a,b))
print(f(a,b))

Единственный плюс использования lambda-выражения вместо локального определенной функции, заключается в том, что вам не придется выдумывать название функции. Лямбда-выражения Питон – это лишь сокращенная запись. На других языках лямбда-формы добавляют функциональность.

Перечислим отличия lambda-выражения от нормального определения функции:

  • не могут содержать pass, assert, return или raise;
  • не имеют имени функции (собственно, отсюда и получили название — анонимные функции);
  • не поддерживает аннотации типов;
  • не могут иметь в теле больше одной строки с выражением.

Как и обычный объект функции, lambda-выражения поддерживают разные способы передачи аргументов:

  • только по позиции;
  • по ключу или по позиции;
  • только по ключу;
  • *args — произвольное кол-во позиционных аргументов;
  • **kwargs — произвольное кол-во именованных аргументов.

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

Пример lambda-выражение для возврата функции:

>>defmake_incrementor(n):
# lambda-выражение принимает переменную ‘x’,
# которая передается как f(x), см. ниже.
…returnlambdax:x+n

>>>f=make_incrementor(42)
>>>f(0)
42
>>>f(1)
43
>>>

Код с частым использованием lambda-функции сложно понимать и читать, а иногда можно даже запутаться.

# Сравните код с lambda-выражением:

fromfunctoolsimportreduce

numbers=[2,1,3,4,7,11,18]
product=reduce(lambdax,y:x*y,numbers,1)

# С кодом простой функции:

defmultiply_all(numbers):
product=1
forninnumbers:
product*=n
returnproduct

numbers=[2,1,3,4,7,11,18]
product=multiply_all(numbers)

Второй код объёмней, но в то же время более простой для понимания, тогда как комбинация reduce/lambda будет намного сложнее для понимания многим программистам.

Lambda-функции чаще всего используются:

  • со встроенными функциями map(), filter(), zip(), а также reduce() — представленными в модуле functools.

# мили в километры

mile=[1.0,6.5,17.4,2.4,9]

kilometer=list(map(lambdax:x*1.6,mile_distances))

print(kilometer)

# Вывод

[1.6,10.4,27.84,3.84,14.4]

  • c ключевыми функциями (а именно, функции принимают ключ в качестве параметра). Ключ может быть lambda-выражением.

list.sort(): дополнительный метод списка

sorted(), min(), max()

# Сортировка словаря

d={‘a’:10,’b’:15,’c’:4}

list_d=list(d.items())

list_d.sort(key=lambdai:i[1])

print(list_d)

# Вывод

[(‘c’,4),(‘a’,10),(‘b’,15)]

  • в качестве списка lambda-выражений. Получается список действий, которые выполняются по требованию:

doit=[(lambdax,y:x+y),(lambdax,y:x-y),(lambdax,y:x*y),(lambdax,y:x/y)]

rez=doit[0](5,12)

  • в качестве словаря, содержащего lambda-функции:

doit={‘neg’:lambdax:x-1,’abs’:lambdax:abs(x)-1,’zero’:lambdax:x}

a=[-3,10,0,1]

foriina:

ifi<0:

print(doit[‘abs’](i))

elifi>0:

print(doit[‘neg’](i))

else:
print(doit[‘zero’](i))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *