В чем разница между python между лямбдой и регулярной функцией?
Мне интересно узнать разницу между функцией lambda
и регулярной функцией (определенной с помощью def
) - на уровне python. (Я знаю, в чем разница для программистов и когда использовать их.)
>>> def a():
return 1
>>> b = lambda: 1
>>> a
<function a at 0x0000000004036F98>
>>> b
<function <lambda> at 0x0000000004031588>
Как мы видим, python знает, что b
- это функция lambda
, а a
- регулярная функция. почему это? в чем разница между ними на python?
Ответы
Ответ 1
Они одного типа, поэтому они обрабатываются одинаково:
>>> type(a)
<type 'function'>
>>> type(b)
<type 'function'>
Python также знает, что b
был определен как лямбда-функция, и он устанавливает это как имя функции:
>>> a.func_name
'a'
>>> b.func_name
'<lambda>'
Другими словами, это влияет на имя, которое получит функция, но что касается Python, обе функции - это значит, что они могут использоваться в основном таким же образом. См. Комментарий к mgilson ниже для важного различия между функциями и лямбда-функциями в отношении травления.
Ответ 2
Единственное отличие состоит в том, что (a) тело лямбда может состоять только из одного выражения, результат которого возвращается из созданной функции и (b) выражение lambda
является выражением, которое оценивается как объект, а оператор def
не имеет значения и создает объект функции и связывает его с именем.
Во всех других существенных отношениях они приводят к идентичным объектам - применяются те же правила охвата и захвата. (Нематериальные различия заключаются в том, что lambda
-созданные функции имеют значение по умолчанию func_name
"<lambda>"
. Это может повлиять на работу в эзотерических случаях - например, попытки раскрыть функции.).
Ответ 3
lambda
создать анонимную функцию. Эта идея взята из функциональных языков программирования. Таким образом, вы можете создать и передать функцию другим функциям, например map
и filter
. (посмотрите здесь)
Вы также можете передавать нормальные функции этим функциям, но поскольку в основном их простые и они нигде больше не используются, это неудобно для всего процесса определения новой функции.
В качестве примера рассмотрим это:
>>> a = [1, 2, 3, 4]
>>> print map( lambda x : x*2 + 1, a )
[3, 5, 7, 9, 11]