有一天,我写了一个类似于以下内容的lambda:
fetch = lambda x: myDictionaryVariable.get(x, "")
但是现在我刚刚学会了,你可以用一个;
而不是换行来分隔python语句,然后学会了即使用冒号你也可以在1行上做简单的语句。所以我意识到我也可以这样写:
def fetch(x): return myDictionaryVariable.get(x, "")
并非我在这里使用;
,但如果我需要,我可以为我的1行功能提供更多功能。我可以写:
def strangeFetch(x): y = "unicorn"; return menu.get(x, y)
那么为什么我需要lambdas呢?为什么他们甚至是python的一部分?鉴于此,他们添加了什么?
答案 0 :(得分:8)
Lambda函数不需要名称。它们不会仅仅因为只使用一次的函数而阻塞命名空间。
a = [[1], [1, 2], [1, 2, 3]]
print min(a, key = lambda x:len(x))
print locals()
正如您所看到的,虽然我们创建了一个lambda函数(在这种情况下,我们可以直接使用len
),但它不会添加到本地名称空间。
它们是use和throw类型的函数。除非将它们分配给某些变量,否则它们可以在使用它们的行之后进行GC。
他们不允许任何python语句和赋值,因此他们可以小信任副作用。
l = [1, 2]
lambda: l = []
这会抛出错误SyntaxError: can't assign to lambda
。 (你可以改变可变对象)。
有时候,它们可以用来击败闭合效果。
答案 1 :(得分:5)
lambda
非常有用。如果它仅用于那个地方,则无需为其指定名称。
将lambda分配给变量的能力刚好超出了语言的正交性:变量可以包含任何类型的值,而lambda创建的函数只是一个值。
答案 2 :(得分:4)
lambda表达式本身就是一个值,而def语句则不是这样。这是因为def语句本质上是函数文字+赋值,而在Python中,赋值不是表达式。
但你不需要 lambdas。你可以使用命名函数做的所有事情。