您能否举一个示例以及其他示例来说明何时以及何时不使用Lambda?
我的书给了我一些例子,但它们令人困惑。
docs.python.org/tutorial/controlflow.html#lambda-forms的哪一部分令人困惑或不完整? 哪本书令人困惑? 它的哪些部分令人困惑?
Lambda源自Lambda演算(AFAIK),最初是在Lisp中实现的,基本上是一个匿名函数-该函数没有名称,可以在线使用,换句话说,您可以将标识符分配给lambda函数在单个表达式中如下所示:
1
2
3>>> addTwo = lambda x: x+2
>>> addTwo(2)
4
这将addTwo分配给匿名函数,该函数接受1个参数x,并且在函数主体中将2加到x,它返回函数主体中最后一个表达式的最后一个值,因此没有return关键字。
上面的代码大致等效于:
1
2
3
4
5>>> def addTwo(x):
... return x+2
...
>>> addTwo(2)
4
除了不使用函数定义外,您还要为lambda分配一个标识符。
使用它们的最佳位置是当您真的不想使用名称定义函数时,可能是因为该函数只会被使用一次而不会被多次使用,在这种情况下,使用函数定义会更好。
使用lambdas的哈希树示例:
1
2
3
4
5
6
7
8
9
10>>> mapTree = {
... 'number': lambda x: x**x,
... 'string': lambda x: x[1:]
... }
>>> otype = 'number'
>>> mapTree[otype](2)
4
>>> otype = 'string'
>>> mapTree[otype]('foo')
'oo'
在此示例中,我实际上并不想为这些函数中的任何一个定义名称,因为我只会在哈希中使用它们,因此,我将使用lambda。
只是一个小小的小问题,就得出了一个很好的答案:lambda并非来自Lisp,而是来自lambda演算。
啊,是的,我的使用错误是由我引起的-我进行了一些修改。 我还有什么要添加/修改的?
+1很棒的答案,请考虑在字典示例中更改名称type。因为它是内置的...
好的答案,但是我建议用更容易理解和更标准的示例替换示例。 类似于在地图中使用lambda(map(lambda x:x * 2,l))。
我不知道您使用的是哪本书,但"深入Python"中有一段我认为是有益的。
在2017年,互联网上任何地方都没有diveintopython.org网站!
使用lambda有点时尚。当您可以摆脱一个非常简单的功能时,通常只是将其存储在某个地方(可能在功能列表中,或在GUI工具包数据结构中等),人们会感到lambda减少了代码中的混乱。
在Python中,只能使一个lambda返回一个表达式,并且lambda不能跨越多行(除非您使用行尾的反斜杠技巧将多行连接在一起)。人们要求Python为lambda添加改进,但是这没有发生。据我了解,为使lambda能够编写任何函数而进行的更改将使Python中的解析代码大大复杂化。而且,由于我们已经有了def来定义函数,因此认为增益不值得复杂化。因此,在某些情况下,您可能希望在无法使用lambda的情况下使用。在这种情况下,您可以只使用def:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15object1.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()仍然具有对功能对象的引用,因此功能对象仍然存在。