Который более предпочтителен для использования: функции лямбды или вложенные функции ('определение')?

Я главным образом использую функции лямбды, но иногда использую вложенные функции, которые, кажется, обеспечивают то же поведение.

Вот некоторые тривиальные примеры, где они функционально делают то же самое, если любой был найден в другой функции:

Функция лямбды

>>> a = lambda x : 1 + x
>>> a(5)
6

Вложенная функция

>>> def b(x): return 1 + x

>>> b(5)
6

Там способствует, к использованию того по другому? (Производительность? Удобочитаемость? Ограничения? Непротиворечивость? и т.д.)

Это даже имеет значение? Если это не делает затем делает, которые нарушают принцип Pythonic:

Должны быть один — и предпочтительно только один — очевидный способ сделать это.

94
задан martineau 23 September 2019 в 18:09
поделиться

9 ответов

Если необходимо присвоиться lambda к имени, используйте def вместо этого. def с являются просто синтаксическим сахаром для присвоения, таким образом, результатом является то же, и они намного более гибки и читаемы.

lambda с может использоваться для [1 114] использование однажды, выбросить функции, которые не будут иметь имени.

Однако этот вариант использования очень редок. Редко необходимо раздавать функциональные объекты без имени.

builtins map() и filter() функциональные объекты потребности, но понимания списка и выражения генератора обычно более читаемы, чем те функции и могут покрыть все варианты использования без потребности лямбд.

Для случаев Вам действительно нужен небольшой функциональный объект, необходимо использовать operator функции модуля, как operator.add вместо lambda x, y: x + y

, Если Вам все еще нужно [приблизительно 119] не покрытые, Вы могли бы рассмотреть запись def, только чтобы быть более читаемыми. Если функция более сложна, чем те в [1 111], модуль, def, вероятно, лучше.

Так, реальный мир, хороший lambda, варианты использования очень редки.

93
ответ дан nosklo 24 November 2019 в 06:06
поделиться

Я соглашаюсь с nosklo. Между прочим, даже с использование однажды, выбросьте функция, большую часть времени Вы просто хотите использовать что-то от модуля оператора.

, НАПРИМЕР:

у Вас есть функция с этой подписью: myFunction (данные, функция обратного вызова).

Вы хотите передать функцию, которые добавляют 2 элемента.

Используя лямбду:

myFunction(data, (lambda x, y : x + y))

pythonic путь:

import operator
myFunction(data, operator.add)

Или курс это - простой пример, но существует много материала, который модуль оператора обеспечивает, включая методы set объектов / методы get для списка и dict. Действительно прохладный.

0
ответ дан e-satis 24 November 2019 в 06:06
поделиться

Если Вы просто собираетесь присвоить лямбду переменной в локальном объеме, можно также использовать определение, потому что это более читаемо и может быть расширено более легко в будущем:

fun = lambda a, b: a ** b # a pointless use of lambda
map(fun, someList)

или

def fun(a, b): return a ** b # more readable
map(fun, someList)
1
ответ дан too much php 24 November 2019 в 06:06
поделиться

Я соглашаюсь с советом nosklo: если необходимо дать функции имя, используйте def. Я резервирую lambda функции для случаев, куда я просто передаю краткий отрывок кода к другой функции, например:

a = [ (1,2), (3,4), (5,6) ]
b = map( lambda x: x[0]+x[1], a )
6
ответ дан Dan Lenski 24 November 2019 в 06:06
поделиться

В этом интервью, Guido van Rossum говорит, что ему жаль, что он не позволил 'лямбде' в Python:

" Q. Какой функцией Python Вы меньше всего довольны?

Иногда я был слишком быстр в принятии вкладов, и позже понял, что это была ошибка. Одним примером были бы некоторые функции функционального программирования, такие как функции лямбды. лямбда является ключевым словом, которое позволяет Вам создать маленькую анонимную функцию; встроенные функции, такие как карта, фильтр, и уменьшают, выполняет функцию по типу последовательности, такому как список.

На практике, это не оказалось этим хорошо. Python только имеет два объема: локальный и глобальный. Это делает функции лямбды записи болезненными, потому что Вы часто хотите к переменным доступа в объеме, где лямбда была определена, но Вы не можете из-за двух объемов. Существует путь вокруг этого, но это - что-то вроде клуджа. Часто кажется намного легче в Python просто использовать для цикла вместо того, чтобы бездельничать с функциями лямбды. карта и друзья работают хорошо только, когда уже существует встроенная функция, которая делает то, что Вы хотите.

, по моему скромному мнению, Iambdas могут иногда быть удобными, но обычно удобны за счет readibility. Можете Вы говорить мне, что это делает:

str(reduce(lambda x,y:x+y,map(lambda x:x**x,range(1,1001))))[-10:]

я записал его, и мне потребовалась минута для понимания его. Это от Euler Проекта - я не скажу, какую проблему, потому что я ненавижу спойлеры, но это выполняет через 0,124 секунды:)

21
ответ дан Aaron Hall 24 November 2019 в 06:06
поделиться

В сущности мне существует два различия:

первое о том, что они делают и что они возвращают:

  • определение является ключевым словом, которое ничего не возвращает и создает 'имя' в локальном пространстве имен.

  • лямбда является ключевым словом, которое возвращает функциональный объект и не создает 'имя' в локальном пространстве имен.

Следовательно, если необходимо вызвать функцию, которая берет функциональный объект, единственный способ сделать, это в одной строке кода Python с лямбдой. Нет никакого эквивалента с определением

В некоторых платформах, это на самом деле довольно распространено; например, я использую Скрученный много, и таким образом делание чего-то как [1 117]

d.addCallback(lambda result: setattr(self, _someVariable, result))

довольно распространено, и более кратко с лямбдами.

второе различие о том, что фактической функции позволяют сделать.

  • функция, определяемая А с 'определением' может содержать любой код Python
  • , функция, определяемая А с 'лямбдой' должна оценить к выражению и не может таким образом содержать операторы как печать, импорт, повышение...

, Например,

def p(x): print x

работы как ожидалось, в то время как

lambda x: print x

SyntaxError.

, Конечно, существуют обходные решения - замена print с sys.stdout.write, или import с __import__. Но обычно Вы - более обеспеченное движение с функцией в этом случае.

30
ответ дан Thomas Vander Stichele 24 November 2019 в 06:06
поделиться

Основное использование лямбды всегда было для простых функций обратного вызова, и для карты, уменьшает, фильтрует, которые требуют функции как аргумента. С пониманиями списка, становящимися нормой и добавленным, позволил если как в:

x = [f for f in range(1, 40) if f % 2]

трудно вообразить реальный случай для использования лямбды в обиходе. В результате я сказал бы, избежал бы лямбды и создал бы вложенные функции.

3
ответ дан apg 24 November 2019 в 06:06
поделиться

лямбда полезна для генерации новых функций:

>>> def somefunc(x): return lambda y: x+y
>>> f = somefunc(10)
>>> f(2)
12
>>> f(4)
14
-2
ответ дан 24 November 2019 в 06:06
поделиться

Важным ограничением лямбда-выражений является то, что они не могут содержать ничего, кроме выражения. Для лямбда-выражения почти невозможно создать что-либо, кроме тривиальных побочных эффектов, поскольку оно не может иметь такого богатого тела, как функция def 'ed.

При этом Lua повлиял на мой стиль программирования. в сторону широкого использования анонимных функций, и я засоряю ими свой код. Вдобавок ко всему, я склонен думать о map / reduce как о абстрактных операторах способами, которые я не рассматриваю в понимании списков или генераторах, почти как если бы я явно откладывал решение о реализации, используя эти операторы.

Редактировать: Это довольно старый вопрос, и мое мнение по этому поводу несколько изменилось.

Во-первых, Я категорически против присвоения переменной лямбда выражения; поскольку у python есть специальный синтаксис только для этого (подсказка, def ). В дополнение к этому, многие варианты использования лямбда, даже если они не получают имени, имеют предопределенные (и более эффективные) реализации. Например, рассматриваемый пример можно сократить до (1) .__ add __ , без необходимости заключать его в лямбда или def . Многие другие распространенные применения могут быть удовлетворены некоторой комбинацией модулей операторов , , itertools и functools .

t получить имя, иметь предопределенные (и более эффективные) реализации. Например, рассматриваемый пример можно сократить до (1) .__ add __ , без необходимости заключать его в лямбда или def . Многие другие распространенные применения могут быть удовлетворены некоторой комбинацией модулей операторов , , itertools и functools .

t получить имя, иметь предопределенные (и более эффективные) реализации. Например, рассматриваемый пример можно сократить до (1) .__ add __ , без необходимости заключать его в лямбда или def . Многие другие распространенные применения могут быть удовлетворены некоторой комбинацией модулей операторов , , itertools и functools .

3
ответ дан 24 November 2019 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: