【问题标题】:Python's lambda with underscore for an argument?Python的带有下划线的lambda作为参数?
【发布时间】:2015-06-28 07:48:09
【问题描述】:

下面的代码是做什么的?

a = lambda _:True

根据我在交互式提示中阅读和测试的内容,它似乎是一个始终返回 True 的函数。

我理解正确吗?我希望了解为什么还要使用下划线 (_)。

【问题讨论】:

  • 对于那些无参数的 lambda,语法是 lambda : True
  • 我不喜欢这篇文章的一点是,问题标题谈到了“带有 NO 变量”的 lambda 函数,但问题主体和几乎所有答案都给出了具有一个变量/参数的 lambda 函数的示例。该变量恰好有一个奇怪的名称_,而不是xa 或其他任何名称。如果有人想知道如何编写一个接受 no 参数的 lambda 函数;方法如下:像这样定义它:my_lambda = lambda : 255。像这样称呼它:x = my_lambda() 你可以用你喜欢的任何返回值替换255
  • @ToothpickAnemone 很好的回复!这些天我主要使用没有变量的 lambda 来初始化 defaultdicts。希望它对阅读此主题的人有用。 ht = {} ht = defaultdict(lambda:0, ht)

标签: python lambda


【解决方案1】:

_ 是变量名。试试吧。 (这个变量名通常是一个被忽略的变量名。可以说是占位符。)

Python:

>>> l = lambda _: True
>>> l()
<lambda>() missing 1 required positional argument: '_'

>>> l("foo")
True

所以这个 lambda 确实需要一个参数。如果您想要一个始终返回 True 的 lambda 无参数,请执行以下操作:

>>> m = lambda: True
>>> m()
True

【讨论】:

  • @dopatraman 用Python 3.6.2Mac OS 10.12 下对其进行了测试,它可以工作。
  • 也许您可以添加变量名称_ 的信息,通常在变量本身并不需要时使用。它就像一个“丢弃变量”,只是一个没有用的占位符。
  • @dopatraman 在 Ipython 中,_ 保存最后一个表达式返回的值。出于这个原因,我避免使用 _ 。 *.com/questions/17580289/…
【解决方案2】:

下划线是命名未使用变量的 Python 约定(例如,静态分析工具不会将其报告为未使用变量)。在您的情况下,未使用 lambda 参数,但创建的对象是单参数函数,始终返回 True。所以你的 lambda 在数学上有点类似于 Constant Function

【讨论】:

  • 不仅是 python 转换,它与语言无关,下划线用于表示变量是临时的或无关紧要的
【解决方案3】:

这似乎是一个无论如何都返回 True 的函数。

是的,它是一个返回 True 的函数(或 lambda)。 underscore 通常是被忽略变量的占位符,在这种情况下是不必要的。

这样一个函数的示例用例(几乎什么都不做):

dd = collections.defaultdict(lambda: True)

当用作defaultdict 的参数时,您可以将True 作为一般默认值。

【讨论】:

    【解决方案4】:

    Lambda 表示函数。 上面的语句和写的一样

    def f(_):
        return True
    

    对于 lambda,需要存在一个变量。所以你传递一个名为_的变量(同样你可以传递xy..)

    【讨论】:

      【解决方案5】:

      下面是有问题的代码行:

      a = lambda _:True
      

      它创建一个具有一个输入参数的函数:_。下划线是一个比较奇怪的变量名选择,但它只是一个变量名。您可以在任何地方使用_,即使不使用 lambda 函数也是如此。例如,而不是....

      my_var = 5
      print(my_var)
      

      你可以写:

      _ = 5
      print(_)
      

      但是,_ 被用作参数名称而不是 xinput 之类的名称是有原因的。我们稍后会讨论。

      首先,我们需要知道 lambda-keyword 构造一个函数,类似于def,但语法不同。 lambda函数的定义,a = lambda _:True,类似这样写:

      def a(_):
          return True
      

      它使用输入参数_ 创建一个名为a 的函数,并返回True。可以很容易地写成a = lambda x:True,用x 代替下划线。但是,当我们不打算使用该变量时,约定是使用_ 作为变量名。考虑以下几点:

      for _ in range(1, 11):
          print('pear')
      

      请注意,循环索引从不在循环体内部使用。我们只是希望循环执行指定的次数。正如winklerrr 所写,“变量名称_ [...] 就像一个“丢弃变量”,只是一个没有用的占位符。”

      同样,对于 ``a = lambda x:True,输入参数不会在函数体内使用。输入参数是什么并不重要,只要有一个。该 lambda 函数的作者写了 _ 而不是 x 之类的东西,表示不会使用该变量。

      请注意,lambda 确实 有一个参数;所以,写

      a(),将引发错误。

      如果你想要一个不带参数的 lambda,可以这样写:

       bar = lambda: True
      

      现在调用bar(),不带参数,可以正常工作。 不带参数的 lambda 不一定总是返回相同的值:

      import random
      process_fruit = lambda : random.random()
      

      上面的 lambda 函数更复杂,只是一个总是返回相同常量的东西。

      程序员有时使用lambda 关键字而不是def 的一个原因是函数特别简短。请注意,lambda 定义通常可以全部放在一行中,而使用 def 语句很难做到这一点。当函数不再使用时,使用lambda 而不是def sf 的另一个原因。如果我们以后不想再次调用该函数,那么就没有必要给该函数起一个名字。例如考虑以下代码:

      def apply_to_each(transform, in_container): out_container = 列表() 对于 idx,枚举中的项目(容器,0): out_container[idx] = 变换(项目) 返回 out_container

      现在我们进行以下调用:

      squares  = apply_to_each(lambda x: x**2 range(0, 101))
      

      请注意,lambda x: x**2 未指定标签。这是因为我们以后可能不会再调用它了,它只是我们暂时需要的简短而简单的东西。

      lambda 函数不需要命名这一事实是另一个名称来描述它们的来源:“匿名函数”。

      另请注意,lambda 语句类似于函数调用,因为它们返回对它们创建的函数的引用。以下是非法的:

      apply_to_each(def foo(x): x**2 ,  range(0, 101))
      

      apply_to_each(lambda x: x**2 range(0, 101)) 很好。

      所以,当我们想要一些简短、可爱且以后可能不想再使用的东西时,我们使用lambda 而不是def_ 而不是长变量名。

      【讨论】:

        【解决方案6】:

        下划线_ 是一个有效的标识符,在这里用作变量名。对于传递给函数的参数,它将始终返回True

        >>>a('123') 
        True
        

        【讨论】:

        • 您好,感谢您的快速回复。所以它是一个总是返回 true 的匿名函数?
        • @laycat;是的。它总是返回 true。