什么是;lambda“;在Python中的意思是什么';最简单的使用方法是什么?

什么是;lambda“;在Python中的意思是什么';最简单的使用方法是什么?,python,lambda,Python,Lambda,您能否给出一个示例和其他示例,说明何时以及何时不使用Lambda? 我的书给了我一些例子,但它们令人困惑。我不知道你在用哪本书,但我认为这本书很有参考价值。Lambda,起源于and(AFAIK),最早是在年实现的,基本上是一个匿名函数-一个没有名字的函数,并且是在线使用的,换句话说,您可以在单个表达式中为lambda函数指定标识符,如下所示: >>> addTwo = lambda x: x+2 >>> addTwo(2) 4 这会将addTwo分配给匿名

您能否给出一个示例和其他示例,说明何时以及何时不使用Lambda?
我的书给了我一些例子,但它们令人困惑。

我不知道你在用哪本书,但我认为这本书很有参考价值。

Lambda,起源于and(AFAIK),最早是在年实现的,基本上是一个匿名函数-一个没有名字的函数,并且是在线使用的,换句话说,您可以在单个表达式中为lambda函数指定标识符,如下所示:

>>> addTwo = lambda x: x+2
>>> addTwo(2)
4
这会将
addTwo
分配给匿名函数,该函数接受1个参数x,并在函数体中将2添加到x,返回函数体中最后一个表达式的最后一个值,因此没有
return
关键字

上述代码大致相当于:

>>> def addTwo(x):
...     return x+2
... 
>>> addTwo(2)
4
除非您没有使用函数定义,否则您将为lambda分配一个标识符

最好使用它们的地方是当您不想用名称定义函数时,可能是因为该函数只使用一次,而不是多次,在这种情况下,最好使用函数定义

使用lambdas的哈希树示例:

>>> mapTree = {
...     'number': lambda x: x**x,
...     'string': lambda x: x[1:]
... }
>>> otype = 'number'
>>> mapTree[otype](2)
4
>>> otype = 'string'
>>> mapTree[otype]('foo')
'oo'

在本例中,我并不想为这两个函数中的任何一个定义名称,因为我只在散列中使用它们,因此我将使用lambdas。

使用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)
object1.register\u callback\u函数(lambda x:x.foo()>3)
def fn(x):
如果x.foo()>3:
x、 重新校准()
返回x.value()>9
elif x.bar()>3:
x、 做点别的事
返回x.其他值<0
其他:
x、 随便
返回真值
对象2.寄存器回调函数(fn)
德尔(fn)

第一个回调函数很简单,一个lambda就足够了。对于第二种情况,根本不可能使用lambda。我们通过使用
def
并创建一个绑定到名称
fn
的函数对象,然后将
fn
传递到
注册回调函数()
来实现相同的效果。然后,为了证明我们可以,我们调用名称
fn
上的
del()。现在名称
fn
不再与任何对象绑定,但是
register\u callback\u function()
仍然有一个对函数对象的引用,因此函数对象仍然存在。

只是对一个很好的答案的一个小小的挑剔:lambda不是源于Lisp,而是源于lambda演算。啊,是的,我使用源代码的错误-我做了一些编辑。还有什么我需要添加/修改的吗?+ 1精彩的答案,考虑在DICT示例中更改名称<代码>类型<代码>。因为这是一个内置的…很好的答案,但我建议用更容易理解、更标准的东西替换这个例子。类似于在地图中使用lambda(map(lambda x:x*2,l))。地图的哪个部分令人困惑或不完整?哪本书令人困惑?哪些部分令人困惑?2017年,万维网上没有diveintopython.org网站!