Python中的"lambda"是什么意思,最简单的用法是什么?

19 投票
3 回答
15541 浏览
提问于 2025-04-15 15:09

你能给我一个例子,还有其他例子,说明什么时候应该用 Lambda,什么时候不应该用吗?我的书里有例子,但我看了觉得很困惑。

3 个回答

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()仍然持有对这个函数对象的引用,所以这个函数对象依然存在。

4

我不知道你在用哪本书,不过《深入Python》有一部分内容我觉得很有帮助。

40

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。

撰写回答