Python的带有下划线的lambda作为参数?

Posted

技术标签:

【中文标题】Python的带有下划线的lambda作为参数?【英文标题】:Python's lambda with underscore for an argument? 【发布时间】: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) What is the purpose of the single underscore "_" variable in Python?的可能重复 【参考方案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。

以上是关于Python的带有下划线的lambda作为参数?的主要内容,如果未能解决你的问题,请参考以下文章

Python lambda不接受元组参数[重复]

python中的lambda

python lambda引发带有多个参数的变量未定义错误

模板函数与带有自动参数的命名 lambda

python lambda表达式的两种用处

Python,lambda 函数作为 groupby 的参数