Lambda функции в Python
Lambda/Лямбда – функция в Питон, которая определяется без имени. Как правило, функции определяем через ключевое слово def. При этом лямбда определяется посредством одноименного ключевого слова.
Данная функция возвращает сумму 2-х аргументов: lambda a, b: a + b. При этом лямбда-функции можно применять, где нужны функциональные объекты. Они синтаксически ограничены одним выражением.
Семантически, они представляют собой синтаксический сахар для нормального определения функции.
deffunc(a,b):
returna+b# равноценно
f=lambdaa,b:a+ba=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
returnproductnumbers=[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))