以下代码做什么?
a = lambda _:True
根据我在交互式提示中阅读和测试的内容,它似乎是一个始终返回的函数True
。
我理解正确吗?我希望理解为什么还要使用下划线(_
)。
以下代码做什么?
a = lambda _:True
根据我在交互式提示中阅读和测试的内容,它似乎是一个始终返回的函数True
。
我理解正确吗?我希望理解为什么还要使用下划线(_
)。
_
,而不是x
ora
或其他名称。如果有人想知道如何编写不带参数的lambda函数,方法如下:定义如下:my_lambda = lambda : 255
。这样称呼:x = my_lambda()
您可以将其替换255
为所需的任何返回值。
Answers:
该_
是变量名。尝试一下。(此变量名称通常是忽略变量的名称。可以说是占位符。)
蟒蛇:
>>> l = lambda _: True
>>> l()
<lambda>() missing 1 required positional argument: '_'
>>> l("foo")
True
因此,此lambda确实需要一个参数。如果您想要不带参数的lambda总是返回True
,请执行以下操作:
>>> m = lambda: True
>>> m()
True
Python 3.6.2
在under下对其进行了测试,Mac OS 10.12
并且可以正常工作。
_
当确实不需要变量本身时,通常使用变量名。这就像一个“扔掉变量”,只是一个没有用的占位符。
下划线是用于命名未使用变量的Python约定(例如,静态分析工具不会将其报告为未使用变量)。在您的情况下,lambda参数未使用,但创建的对象是始终返回的单参数函数True
。因此,您的lambda有点类似于数学中的常量函数。
它似乎是一个返回True的函数。
是的,它是一个返回True的函数(或lambda)。的下划线,这通常是用于忽略可变的占位符,在这种情况下是不必要的。
此类函数的示例用例(几乎不执行任何操作):
dd = collections.defaultdict(lambda: True)
当用作defaultdict的参数时,您可以将其True
用作常规默认值。
下划线_
是有效的标识符,在这里用作变量名。它将始终返回True
传递给函数的参数。
>>>a('123')
True
下面是有问题的代码行:
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()
,而无需使用args,就可以了。不带参数的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 = id(list()for idx,enumerate(container,0)中的项目:out_container [idx] = transform(item)返回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
和_
而是一个长变量名的时候,我们想要的东西短,甜,可能不会再希望以后使用。
lambda : True