【发布时间】:2010-12-07 16:54:15
【问题描述】:
您能否举一个例子和其他例子来说明何时以及何时不使用 Lambda? 我的书给了我一些例子,但它们令人困惑。
【问题讨论】:
-
docs.python.org/tutorial/controlflow.html#lambda-forms 的哪一部分令人困惑或不完整?哪本书令人困惑?它的哪些部分令人困惑?
您能否举一个例子和其他例子来说明何时以及何时不使用 Lambda? 我的书给了我一些例子,但它们令人困惑。
【问题讨论】:
Lambda 起源于 Lambda Calculus 并且 (AFAIK) 最初是在 Lisp 中实现的,它基本上是一个匿名函数 - 一个没有名称的函数,并且是内联使用的,换句话说,你可以将标识符分配给单个表达式中的 lambda 函数,如下所示:
>>> addTwo = lambda x: x+2
>>> addTwo(2)
4
这会将addTwo 分配给匿名函数,该函数接受1 个参数x,并在函数体中将x 加2,它返回函数体中最后一个表达式的最后一个值,因此没有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'
在本例中,我并不想为其中任何一个函数定义名称,因为我只会在散列中使用它们,因此我将使用 lambda。
【讨论】:
type.. 因为它是内置的...
我不知道您使用的是哪本书,但我认为Dive into Python has a section 提供了丰富的信息。
【讨论】:
使用 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() 来实现相同的效果。然后,为了证明我们可以,我们在名称 fn 上调用 del() 以解除绑定。现在名称 fn 不再与任何对象绑定,但 register_callback_function() 仍然具有对函数对象的引用,因此函数对象继续存在。
【讨论】: