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 函数的示例。该变量恰好有一个奇怪的名称_
,而不是x
或a
或其他任何名称。如果有人想知道如何编写一个接受 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.2
在Mac 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,需要存在一个变量。所以你传递一个名为_
的变量(同样你可以传递x
,y
..)
【讨论】:
【参考方案5】:下面是有问题的代码行:
a = lambda _:True
它创建一个具有一个输入参数的函数:_
。下划线是一个比较奇怪的变量名选择,但它只是一个变量名。您可以在任何地方使用_
,即使不使用 lambda 函数也是如此。例如,而不是....
my_var = 5
print(my_var)
你可以写:
_ = 5
print(_)
但是,_
被用作参数名称而不是 x
或 input
之类的名称是有原因的。我们稍后会讨论。
首先,我们需要知道 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作为参数?的主要内容,如果未能解决你的问题,请参考以下文章