为什么使用lambdas vs 1-line函数声明?

时间:2013-12-20 03:19:38

标签: python function python-3.x lambda

有一天,我写了一个类似于以下内容的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的一部分?鉴于此,他们添加了什么?

3 个答案:

答案 0 :(得分:8)

  1. Lambda函数不需要名称。它们不会仅仅因为只使用一次的函数而阻塞命名空间。

    a = [[1], [1, 2], [1, 2, 3]]
    print min(a, key = lambda x:len(x))
    print locals()
    

    正如您所看到的,虽然我们创建了一个lambda函数(在这种情况下,我们可以直接使用len),但它不会添加到本地名称空间。

  2. 它们是use和throw类型的函数。除非将它们分配给某些变量,否则它们可以在使用它们的行之后进行GC。

  3. 他们不允许任何python语句和赋值,因此他们可以信任副作用。

    l = [1, 2]
    lambda: l = []
    

    这会抛出错误SyntaxError: can't assign to lambda。 (你可以改变可变对象)。

  4. 有时候,它们可以用来击败闭合效果。

答案 1 :(得分:5)

当您想要使用匿名函数作为另一个函数的参数时,

lambda非常有用。如果它仅用于那个地方,则无需为其指定名称。

将lambda分配给变量的能力刚好超出了语言的正交性:变量可以包含任何类型的值,而lambda创建的函数只是一个值。

答案 2 :(得分:4)

lambda表达式本身就是一个值,而def语句则不是这样。这是因为def语句本质上是函数文字+赋值,而在Python中,赋值不是表达式。

但你不需要 lambdas。你可以使用命名函数做的所有事情。