下面是有问题的代码行:
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 和_ 而不是长变量名。