您能举例说明何时何何不使用Lambda? 我的书给了我一些例子,但它们令人困惑。
答案 0 :(得分:38)
源自Lambda Calculus和(AFAIK)的Lambda最初在Lisp中实现,基本上是一个匿名函数 - 一个没有名称的函数,并且是在线使用的,换句话说,您可以在单个表达式中为lambda函数指定一个标识符,如下所示:
>>> addTwo = lambda x: x+2
>>> addTwo(2)
4
这将addTwo
赋给匿名函数,该函数接受1个参数x,并且在函数体中它将2加到x,它返回函数体中最后一个表达式的最后一个值,因此没有{{ 1}}关键字。
上面的代码大致相当于:
return
除非你没有使用函数定义,否则你要为lambda分配一个标识符。
使用它们的最佳位置是当你真的不想用一个名字来定义一个函数时,可能是因为该函数只能用一个时间而不是多次,在这种情况下使用函数定义会更好。
使用lambdas的哈希树示例:
>>> def addTwo(x):
... return x+2
...
>>> addTwo(2)
4
在这个例子中,我真的不想为这些函数中的任何一个定义名称,因为我只在哈希中使用它们,因此我将使用lambdas。
答案 1 :(得分:4)
我不知道你使用的是哪本书,但我认为Dive into Python has a section是有用的。
答案 2 :(得分:3)
使用lambda是一种风格的东西。如果你可以使用一个非常简单的函数,通常只是将它存储在某个地方(可能在函数列表中,或者在GUI工具包数据结构中等),人们会觉得lambda会减少代码中的混乱。
在Python中,只能生成一个返回单个表达式的lambda,并且lambda不能跨越多行(除非你通过使用反斜杠在线结束时加入多行)。人们已经要求Python为lambda添加改进,但它没有发生。据我了解,使lambda能够编写任何函数的更改将使Python中的解析代码变得非常复杂。而且,由于我们已经有def
来定义函数,因此并不认为增益是复杂的。因此,在某些情况下,您可能希望在不可能的情况下使用lambda。在这种情况下,您只需使用def
:
object1.register_callback_function(lambda x: x.foo() > 3)
def fn(x):
if x.foo() > 3:
x.recalibrate()
return x.value() > 9
elif x.bar() > 3:
x.do_something_else()
return x.other_value < 0
else:
x.whatever()
return True
object2.register_callback_function(fn)
del(fn)
第一个回调函数很简单,lambda就足够了。对于第二个,根本不可能使用lambda。我们通过使用def
并创建绑定到名称fn
的函数对象,然后将fn
传递给register_callback_function()
来实现相同的效果。然后,为了表明我们可以,我们在名称del()
上调用fn
来解除绑定。现在名称fn
不再与任何对象绑定,但register_callback_function()
仍然具有对函数对象的引用,因此函数对象仍然存在。