Python中的"lambda"是什么意思,最简单的用法是什么?
你能给我一个例子,还有其他例子,说明什么时候应该用 Lambda,什么时候不应该用吗?我的书里有例子,但我看了觉得很困惑。
3 个回答
使用lambda表达式有点像是一种风格选择。当你需要一个非常简单的函数,并且通常只是把它存储在某个地方(比如函数列表,或者图形用户界面工具包的数据结构等),人们觉得用lambda可以让代码看起来更简洁。
在Python中,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()
。接着,为了展示我们可以这样做,我们对名字fn
调用del()
来解除绑定。现在,名字fn
不再和任何对象绑定,但register_callback_function()
仍然持有对这个函数对象的引用,所以这个函数对象依然存在。
我不知道你在用哪本书,不过《深入Python》有一部分内容我觉得很有帮助。
Lambda,最初来源于λ演算,据我所知,最早是在Lisp语言中实现的,基本上就是一种匿名函数——也就是说,它没有名字,可以直接在代码中使用。换句话说,你可以在一个表达式中给这个lambda函数起个别名,像这样:
>>> addTwo = lambda x: x+2
>>> addTwo(2)
4
这段代码把addTwo
这个名字赋给了这个匿名函数,这个函数接受一个参数x,然后在函数内部把2加到x上,最后返回这个计算的结果,所以这里不需要用到return
这个关键词。
上面的代码大致等同于:
>>> def addTwo(x):
... return x+2
...
>>> addTwo(2)
4
不过这里你并没有使用函数定义,而是把一个名字赋给了lambda。
使用lambda的最佳时机是当你不想给一个函数起名字,可能是因为这个函数只会用一次,而不是多次,这种情况下用函数定义会更合适。
下面是一个使用lambda的哈希树示例:
>>> mapTree = {
... 'number': lambda x: x**x,
... 'string': lambda x: x[1:]
... }
>>> otype = 'number'
>>> mapTree[otype](2)
4
>>> otype = 'string'
>>> mapTree[otype]('foo')
'oo'
在这个例子中,我并不想给这两个函数起名字,因为我只会在哈希内部使用它们,所以我选择使用lambda。