Python 的 lambda 加下划线作为参数?

下面的代码做什么?

a = lambda _:True

从我在交互式提示符中阅读和测试的内容来看,它似乎是一个总是返回 True的函数。

我的理解正确吗? 我希望能够理解为什么使用下划线(_)。

94836 次浏览

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

>>>a('123')
True

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

Yes, it is a function (or lambda) that returns True. The 下划线, which is usually a placeholder for an ignored variable, is unnecessary in this case.

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

dd = collections.defaultdict(lambda: True)

当用作 违约判决的参数时,可以将 True作为一般默认值。

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

巨蟒:

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


>>> l("foo")
True

So this lambda 确实需要一个论据. If you want a lambda 毫无争议 that always returns True, do this:

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

Lambda 表示一个函数。 以上陈述与书面陈述相同

def f(_):
return True

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

下划线是一种 Python 约定,用于命名一个未使用的变量(例如,静态分析工具不会将其报告为未使用的变量)。在您的例子中,lambda 参数是未使用的,但是创建的对象是单参数函数,它总是返回 True。所以你的 lambda 在数学上有点类似于 常数功能

下面是有问题的代码行:

a = lambda _:True

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

my_var = 5
print(my_var)

你可以写:

_ = 5
print(_)

但是,使用 _作为参数名称而不是 xinput之类的名称是有原因的。我们一会儿再说这个。

首先,我们需要知道 lambda 关键字构造了一个类似于 def但语法不同的函数。Lambda 函数 a = lambda _:True的定义类似于写作:

def a(_):
return True

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

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

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

同样,对于“ a = lambda x: True,输入参数不在函数体内使用。输入参数是什么并不重要,只要有一个就行。Lambda 函数的作者编写了 _而不是类似于 x的代码,以表明不会使用该变量。

注意,lambda 是的有一个参数; 因此,写入

a(),将引发一个错误。

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

 bar = lambda: True

现在调用 bar(),没有参数,将工作正常。 A lambda which takes no arguments need not always return the same value:

import random
process_fruit = lambda : random.random()

The lambda function above is more complex that just a something which always returns the same constant.

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

Def application _ to _ each (转换,in _ Container) : Out _ Container = list () 对于 idx,枚举(容器,0)中的项: Out _ Container [ idx ] = 转换(item) 返回 out _ container

现在我们做出如下决定:

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

Notice that lambda x: x**2 is not given a label. This is because we probably won't call it again later, it was just something short and simple we needed temporarily.

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

Also note that lambda-statements are like a function-call in that they return a reference to the function they create. The following is illegal:

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

然而,apply_to_each(lambda x: x**2 range(0, 101))还不错。

因此,我们使用 lambda而不是 def_,而不是一个长的变量名,当我们想要的东西短,甜,可能不会想要再次使用以后。