Я главным образом использую функции лямбды, но иногда использую вложенные функции, которые, кажется, обеспечивают то же поведение.
Вот некоторые тривиальные примеры, где они функционально делают то же самое, если любой был найден в другой функции:
Функция лямбды
>>> a = lambda x : 1 + x
>>> a(5)
6
Вложенная функция
>>> def b(x): return 1 + x
>>> b(5)
6
Там способствует, к использованию того по другому? (Производительность? Удобочитаемость? Ограничения? Непротиворечивость? и т.д.)
Это даже имеет значение? Если это не делает затем делает, которые нарушают принцип Pythonic:
Должны быть один — и предпочтительно только один — очевидный способ сделать это.
Если необходимо присвоиться lambda
к имени, используйте def
вместо этого. def
с являются просто синтаксическим сахаром для присвоения, таким образом, результатом является то же, и они намного более гибки и читаемы.
lambda
с может использоваться для [1 114] использование однажды, выбросить функции, которые не будут иметь имени.
Однако этот вариант использования очень редок. Редко необходимо раздавать функциональные объекты без имени.
builtins map()
и filter()
функциональные объекты потребности, но понимания списка и выражения генератора обычно более читаемы, чем те функции и могут покрыть все варианты использования без потребности лямбд.
Для случаев Вам действительно нужен небольшой функциональный объект, необходимо использовать operator
функции модуля, как operator.add
вместо lambda x, y: x + y
, Если Вам все еще нужно [приблизительно 119] не покрытые, Вы могли бы рассмотреть запись def
, только чтобы быть более читаемыми. Если функция более сложна, чем те в [1 111], модуль, def
, вероятно, лучше.
Так, реальный мир, хороший lambda
, варианты использования очень редки.
Я соглашаюсь с nosklo. Между прочим, даже с использование однажды, выбросьте функция, большую часть времени Вы просто хотите использовать что-то от модуля оператора.
, НАПРИМЕР:
у Вас есть функция с этой подписью: myFunction (данные, функция обратного вызова).
Вы хотите передать функцию, которые добавляют 2 элемента.
Используя лямбду:
myFunction(data, (lambda x, y : x + y))
pythonic путь:
import operator
myFunction(data, operator.add)
Или курс это - простой пример, но существует много материала, который модуль оператора обеспечивает, включая методы set объектов / методы get для списка и dict. Действительно прохладный.
Если Вы просто собираетесь присвоить лямбду переменной в локальном объеме, можно также использовать определение, потому что это более читаемо и может быть расширено более легко в будущем:
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)
Я соглашаюсь с советом nosklo: если необходимо дать функции имя, используйте def
. Я резервирую lambda
функции для случаев, куда я просто передаю краткий отрывок кода к другой функции, например:
a = [ (1,2), (3,4), (5,6) ]
b = map( lambda x: x[0]+x[1], a )
В этом интервью, 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 секунды:)
В сущности мне существует два различия:
первое о том, что они делают и что они возвращают:
определение является ключевым словом, которое ничего не возвращает и создает 'имя' в локальном пространстве имен.
лямбда является ключевым словом, которое возвращает функциональный объект и не создает 'имя' в локальном пространстве имен.
Следовательно, если необходимо вызвать функцию, которая берет функциональный объект, единственный способ сделать, это в одной строке кода Python с лямбдой. Нет никакого эквивалента с определением
В некоторых платформах, это на самом деле довольно распространено; например, я использую Скрученный много, и таким образом делание чего-то как [1 117]
d.addCallback(lambda result: setattr(self, _someVariable, result))
довольно распространено, и более кратко с лямбдами.
второе различие о том, что фактической функции позволяют сделать.
, Например,
def p(x): print x
работы как ожидалось, в то время как
lambda x: print x
SyntaxError.
, Конечно, существуют обходные решения - замена print
с sys.stdout.write
, или import
с __import__
. Но обычно Вы - более обеспеченное движение с функцией в этом случае.
Основное использование лямбды всегда было для простых функций обратного вызова, и для карты, уменьшает, фильтрует, которые требуют функции как аргумента. С пониманиями списка, становящимися нормой и добавленным, позволил если как в:
x = [f for f in range(1, 40) if f % 2]
трудно вообразить реальный случай для использования лямбды в обиходе. В результате я сказал бы, избежал бы лямбды и создал бы вложенные функции.
лямбда полезна для генерации новых функций:
>>> def somefunc(x): return lambda y: x+y
>>> f = somefunc(10)
>>> f(2)
12
>>> f(4)
14
Важным ограничением лямбда-выражений является то, что они не могут содержать ничего, кроме выражения. Для лямбда-выражения почти невозможно создать что-либо, кроме тривиальных побочных эффектов, поскольку оно не может иметь такого богатого тела, как функция def
'ed.
При этом Lua повлиял на мой стиль программирования. в сторону широкого использования анонимных функций, и я засоряю ими свой код. Вдобавок ко всему, я склонен думать о map / reduce как о абстрактных операторах способами, которые я не рассматриваю в понимании списков или генераторах, почти как если бы я явно откладывал решение о реализации, используя эти операторы.
Редактировать: Это довольно старый вопрос, и мое мнение по этому поводу несколько изменилось.
Во-первых, Я категорически против присвоения переменной лямбда
выражения; поскольку у python есть специальный синтаксис только для этого (подсказка, def
). В дополнение к этому, многие варианты использования лямбда, даже если они не получают имени, имеют предопределенные (и более эффективные) реализации. Например, рассматриваемый пример можно сократить до (1) .__ add __
, без необходимости заключать его в лямбда
или def
. Многие другие распространенные применения могут быть удовлетворены некоторой комбинацией модулей операторов ,
, itertools
и functools
.
(1) .__ add __
, без необходимости заключать его в лямбда
или def
. Многие другие распространенные применения могут быть удовлетворены некоторой комбинацией модулей операторов ,
, itertools
и functools
. t получить имя, иметь предопределенные (и более эффективные) реализации. Например, рассматриваемый пример можно сократить до (1) .__ add __
, без необходимости заключать его в лямбда
или def
. Многие другие распространенные применения могут быть удовлетворены некоторой комбинацией модулей операторов ,
, itertools
и functools
.