【问题标题】:Why use lambdas vs 1-line function declarations? [duplicate]为什么使用 lambdas 与 1 行函数声明? [复制]
【发布时间】:2014-01-08 20:25:07
【问题描述】:

前几天我写了一个类似于下面的 lambda:

fetch = lambda x: myDictionaryVariable.get(x, "")

但现在我刚刚了解到,在某种程度上,您可以使用; 而不是换行符来分隔 python 语句,然后了解到即使使用冒号,您也可以在 1 行上执行简单的语句。所以我意识到我也可以这样写:

def fetch(x): return myDictionaryVariable.get(x, "")

不是我在这里使用;,但如果我需要,我可以,从而为我的 1-line 函数提供更多功能。我可以写:

def strangeFetch(x): y = "unicorn"; return menu.get(x, y)

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

【问题讨论】:

  • 别着急——每次有人问起 lambda 时,很快就会有票数接近。我怀疑他们是害怕阅读关于 lambda 的坏东西的 Lisp'ers ;-) 顺便说一句,不要对 1-liner disease 着迷:阅读代码的次数多于编写的次数,strangeFetch() 很糟糕。
  • 每当有人问“为什么语言 X 设计成这样?”时也会发生这种情况
  • 我不知道我是否会以意见为由投票结束;我可能已经投票决定关闭作为一个副本。查看右侧的“相关”问题。
  • Barmar 我确实读过,但我认为我的问题有所不同,因为我专门询问何时使用它们与使用 1 行 def 语句。哦,嘿@TimPeters,我还想知道您是否对我刚刚问的这个问题的最佳实践有任何官方见解:stackoverflow.com/questions/20695516/…
  • 并不是没有设计决策的原因,而是对这些原因的讨论不被认为是 SO 的主题。

标签: python function python-3.x lambda


【解决方案1】:
  1. Lambda 函数不需要名称。它们不会仅仅因为一个只使用一次的函数而阻塞你的命名空间。

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

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

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

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

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

    这将引发错误,SyntaxError: can't assign to lambda。 (不过你可以改变可变对象)。

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

【讨论】:

    【解决方案2】:

    lambda 在您想将匿名函数用作另一个函数的参数时很有用。如果它只在那个地方使用,则无需为其指定名称。

    将 lambda 赋值给变量的能力只是超出了语言的正交性:变量可以保存任何类型的值,而由 lambda 创建的函数只是一个值。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 1970-01-01
        相关资源
        最近更新 更多