“lambda”在Python中意味着什么,以及使用它的最简单方法是什么?

时间:2009-10-18 00:44:25

标签: python lambda

您能举例说明何时何何不使用Lambda? 我的书给了我一些例子,但它们令人困惑。

3 个答案:

答案 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()仍然具有对函数对象的引用,因此函数对象仍然存在。