Подтвердить что ты не робот

В чем разница между 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?

4b9b3361

Ответ 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]