Python 的带有下划线的 lambda 参数?
Python's lambda with underscore for an argument?
下面的代码是做什么的?
a = lambda _:True
根据我在交互式提示中阅读和测试的内容,它似乎是 returns 总是 True
的功能。
我理解正确吗?我希望理解为什么还使用了下划线 (_
)。
下划线_
是一个有效的标识符,在这里用作变量名。对于传递给函数的参数,它总是 return True
。
>>>a('123')
True
it seems to be a function that returns True regardless.
是的,returns 是一个函数(或 lambda)。 underscore 通常是被忽略变量的占位符,在这种情况下是不必要的。
此类函数(几乎不执行任何操作)的示例用例:
dd = collections.defaultdict(lambda: True)
当用作 defaultdict 的参数时,您可以将 True
作为一般默认值。
_
是变量名。尝试一下。
(此变量名通常是被忽略变量的名称。可以说是占位符。)
Python:
>>> l = lambda _: True
>>> l()
<lambda>() missing 1 required positional argument: '_'
>>> l("foo")
True
所以这个 lambda 确实需要一个参数。如果你想要一个没有参数的 lambda 总是 returns True
,这样做:
>>> m = lambda: True
>>> m()
True
Lambda 表示一个函数。
上面的语句和写
是一样的
def f(_):
return True
对于 lambda,需要存在一个变量。所以你传递给它一个名为 _
的变量(同样你可以传递 x
, y
..)
下划线是 Python 命名未使用变量的约定(例如,静态分析工具不会将其报告为未使用变量)。在您的情况下,lambda 参数未使用,但创建的对象是单参数函数,始终 returns True
。所以你的lambda有点类似于数学中的Constant Function。
下面是有问题的代码行:
a = lambda _:True
它创建了一个具有一个输入参数的函数:_
。下划线是一个相当奇怪的变量名选择,但它只是一个变量名。您可以在任何地方使用 _
,即使不使用 lambda 函数也是如此。例如,而不是....
my_var = 5
print(my_var)
你可以这样写:
_ = 5
print(_)
但是,使用_
作为参数名称而不是x
或input
之类的名称是有原因的。我们稍后会讲到。
首先,我们要知道lambda-关键字构造了一个函数,类似于def
,只是语法不同。 lambda函数的定义,a = lambda _:True
,类似于写法:
def a(_):
return True
它创建了一个名为 a
的函数,带有一个输入参数 _
,并且它 returns True
。用 x
代替下划线也可以很容易地写成 a = lambda x:True
。但是,当我们不打算使用该变量时,约定是使用 _
作为变量名。考虑以下几点:
for _ in range(1, 11):
print('pear')
请注意,循环索引从不在循环体内使用。我们只是希望循环执行指定的次数。正如 winklerrr
所写,"the variable name _
is [...] like a "throw-away-variable",只是一个没有用的占位符。"
同样,对于 ``a = lambda x:True</code>,函数体内不使用输入参数。只要有一个,输入参数是什么并不重要。该 lambda 函数的作者写了 <code>_
而不是 x
之类的东西,以表明不会使用该变量。
请注意,lambda 确实 有一个参数;所以,写
a()
,会报错。
如果你想要一个没有参数的 lambda,写这样的东西:
bar = lambda: True
现在调用 bar()
,没有参数,就可以正常工作了。
不带参数的 lambda 不需要总是 return 相同的值:
import random
process_fruit = lambda : random.random()
上面的 lambda 函数比一个总是 return 相同常数的东西更复杂。
程序员有时使用 lambda
关键字而不是 def
的一个原因是针对特别简短的函数。请注意,lambda
定义通常可以放在一行中,而使用 def 语句很难做到这一点。使用 lambda
而不是 def
sf 的另一个原因是该函数将不再被使用。如果我们以后不想再调用这个函数,那么就不需要给函数起名字了。例如考虑以下代码:
def apply_to_each(变换,in_container):
out_container = 列表()
对于 idx,枚举中的项目(容器,0):
out_container[idx] = 变换(项目)
returnout_container
现在我们进行以下调用:
squares = apply_to_each(lambda x: x**2 range(0, 101))
请注意 lambda x: x**2
没有给出标签。这是因为我们以后可能不会再调用它,它只是我们临时需要的一些简短的东西。
lambda 函数无需命名这一事实是描述它们的另一个名称的来源:"anonymous functions."
另请注意,lambda 语句类似于函数调用,因为它们 return 是对其创建的函数的引用。以下是非法的:
apply_to_each(def foo(x): x**2 , range(0, 101))
然而,apply_to_each(lambda x: x**2 range(0, 101))
就好了。
因此,当我们想要一些简短、甜美且可能以后不想再使用的东西时,我们使用 lambda
代替 def
和 _
代替长变量名。
下面的代码是做什么的?
a = lambda _:True
根据我在交互式提示中阅读和测试的内容,它似乎是 returns 总是 True
的功能。
我理解正确吗?我希望理解为什么还使用了下划线 (_
)。
下划线_
是一个有效的标识符,在这里用作变量名。对于传递给函数的参数,它总是 return True
。
>>>a('123')
True
it seems to be a function that returns True regardless.
是的,returns 是一个函数(或 lambda)。 underscore 通常是被忽略变量的占位符,在这种情况下是不必要的。
此类函数(几乎不执行任何操作)的示例用例:
dd = collections.defaultdict(lambda: True)
当用作 defaultdict 的参数时,您可以将 True
作为一般默认值。
_
是变量名。尝试一下。
(此变量名通常是被忽略变量的名称。可以说是占位符。)
Python:
>>> l = lambda _: True
>>> l()
<lambda>() missing 1 required positional argument: '_'
>>> l("foo")
True
所以这个 lambda 确实需要一个参数。如果你想要一个没有参数的 lambda 总是 returns True
,这样做:
>>> m = lambda: True
>>> m()
True
Lambda 表示一个函数。 上面的语句和写
是一样的def f(_):
return True
对于 lambda,需要存在一个变量。所以你传递给它一个名为 _
的变量(同样你可以传递 x
, y
..)
下划线是 Python 命名未使用变量的约定(例如,静态分析工具不会将其报告为未使用变量)。在您的情况下,lambda 参数未使用,但创建的对象是单参数函数,始终 returns True
。所以你的lambda有点类似于数学中的Constant Function。
下面是有问题的代码行:
a = lambda _:True
它创建了一个具有一个输入参数的函数:_
。下划线是一个相当奇怪的变量名选择,但它只是一个变量名。您可以在任何地方使用 _
,即使不使用 lambda 函数也是如此。例如,而不是....
my_var = 5
print(my_var)
你可以这样写:
_ = 5
print(_)
但是,使用_
作为参数名称而不是x
或input
之类的名称是有原因的。我们稍后会讲到。
首先,我们要知道lambda-关键字构造了一个函数,类似于def
,只是语法不同。 lambda函数的定义,a = lambda _:True
,类似于写法:
def a(_):
return True
它创建了一个名为 a
的函数,带有一个输入参数 _
,并且它 returns True
。用 x
代替下划线也可以很容易地写成 a = lambda x:True
。但是,当我们不打算使用该变量时,约定是使用 _
作为变量名。考虑以下几点:
for _ in range(1, 11):
print('pear')
请注意,循环索引从不在循环体内使用。我们只是希望循环执行指定的次数。正如 winklerrr
所写,"the variable name _
is [...] like a "throw-away-variable",只是一个没有用的占位符。"
同样,对于 ``a = lambda x:True</code>,函数体内不使用输入参数。只要有一个,输入参数是什么并不重要。该 lambda 函数的作者写了 <code>_
而不是 x
之类的东西,以表明不会使用该变量。
请注意,lambda 确实 有一个参数;所以,写
a()
,会报错。
如果你想要一个没有参数的 lambda,写这样的东西:
bar = lambda: True
现在调用 bar()
,没有参数,就可以正常工作了。
不带参数的 lambda 不需要总是 return 相同的值:
import random
process_fruit = lambda : random.random()
上面的 lambda 函数比一个总是 return 相同常数的东西更复杂。
程序员有时使用 lambda
关键字而不是 def
的一个原因是针对特别简短的函数。请注意,lambda
定义通常可以放在一行中,而使用 def 语句很难做到这一点。使用 lambda
而不是 def
sf 的另一个原因是该函数将不再被使用。如果我们以后不想再调用这个函数,那么就不需要给函数起名字了。例如考虑以下代码:
def apply_to_each(变换,in_container): out_container = 列表() 对于 idx,枚举中的项目(容器,0): out_container[idx] = 变换(项目) returnout_container
现在我们进行以下调用:
squares = apply_to_each(lambda x: x**2 range(0, 101))
请注意 lambda x: x**2
没有给出标签。这是因为我们以后可能不会再调用它,它只是我们临时需要的一些简短的东西。
lambda 函数无需命名这一事实是描述它们的另一个名称的来源:"anonymous functions."
另请注意,lambda 语句类似于函数调用,因为它们 return 是对其创建的函数的引用。以下是非法的:
apply_to_each(def foo(x): x**2 , range(0, 101))
然而,apply_to_each(lambda x: x**2 range(0, 101))
就好了。
因此,当我们想要一些简短、甜美且可能以后不想再使用的东西时,我们使用 lambda
代替 def
和 _
代替长变量名。