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

tem*_*ame 9 python lambda function python-3.x

前几天我写了一个类似于以下内容的lambda:

fetch = lambda x: myDictionaryVariable.get(x, "")
Run Code Online (Sandbox Code Playgroud)

但是现在我刚刚学会了这一点,你可以用一个;而不是换行来分隔python语句,然后学会了即使用冒号也可以在1行上做简单的语句.所以我意识到我也可以这样写:

def fetch(x): return myDictionaryVariable.get(x, "")
Run Code Online (Sandbox Code Playgroud)

不是我在;这里使用,但如果我需要,我可以为我的1行功能提供更多功能.我可以写:

def strangeFetch(x): y = "unicorn"; return menu.get(x, y)
Run Code Online (Sandbox Code Playgroud)

那么为什么我需要lambdas呢?为什么他们甚至是python的一部分?鉴于此,他们添加了什么?

the*_*eye 9

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

    a = [[1], [1, 2], [1, 2, 3]]
    print min(a, key = lambda x:len(x))
    print locals()
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  3. 它们不允许任何python语句和赋值,因此它们可能很少受到副作用的信任.

    l = [1, 2]
    lambda: l = []
    
    Run Code Online (Sandbox Code Playgroud)

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

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


Bar*_*mar 6

lambda当您想要使用匿名函数作为另一个函数的参数时,此选项很有用.如果仅在该位置使用它,则无需为其指定名称.

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