Python的lambda没有变量?

lay*_*cat 72 python lambda

以下代码有什么作用?

a = lambda _:True
Run Code Online (Sandbox Code Playgroud)

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

我理解正确吗?我希望理解为什么_还使用了下划线().

小智 118

_是变量名.试试吧.(这个变量名通常是被忽略变量的名称.可以这么说占位符.)

蟒蛇:

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

>>> l("foo")
True
Run Code Online (Sandbox Code Playgroud)

所以这个lambda 确实需要一个参数.如果你想要一个总是返回没有参数的lambda True,那么执行以下操作:

>>> m = lambda: True
>>> m()
True
Run Code Online (Sandbox Code Playgroud)

  • @dopatraman在`Mac OS 10.12`下使用`Python 3.6.2`测试它并且它可以工作. (7认同)
  • 也许您可以添加变量名称`_`常用于不真正需要变量本身的信息.它就像一个"扔掉变量",只是一个没用的占位符. (6认同)
  • @dopatraman在Ipython中, _ 保存最后一个表达式返回的值。由于这个原因,我避免使用 _ 。/sf/ask/1230620261/ (2认同)

Too*_*one 9

下面是有问题的代码行:

a = lambda _:True
Run Code Online (Sandbox Code Playgroud)

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

my_var = 5
print(my_var)
Run Code Online (Sandbox Code Playgroud)

你可以写:

_ = 5
print(_)
Run Code Online (Sandbox Code Playgroud)

但是,使用或_之类的名称作为参数名称是有原因的。我们稍后会讨论这个问题。xinput

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

def a(_):
    return True
Run Code Online (Sandbox Code Playgroud)

a它创建一个以输入参数命名的函数_,并返回True。人们可以很容易地写成a = lambda x:True,用x代替下划线。但是,约定是_当我们不打算使用该变量时将其用作变量名。考虑以下:

for _ in range(1, 11):
    print('pear')
Run Code Online (Sandbox Code Playgroud)

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

同样,对于“a = lambda x:True”,输入参数不在函数体内使用。输入参数是什么并不重要,只要有一个即可。该 lambda 函数的作者编写了_类似x, 的内容来表明该变量不会被使用。

请注意,lambda确实有一个参数;所以,写

a(),会引发错误。

如果你想要一个不带参数的 lambda,请编写如下内容:

 bar = lambda: True
Run Code Online (Sandbox Code Playgroud)

现在调用bar(),不带参数,就可以正常工作了。不带参数的 lambda 不需要总是返回相同的值:

import random
process_fruit = lambda : random.random()
Run Code Online (Sandbox Code Playgroud)

上面的 lambda 函数比总是返回相同常量的函数更复杂。

lambda程序员有时使用关键字而不是关键字的原因之一def 是函数特别短且简单。请注意,一个lambda定义通常可以放在一行中,而使用 def 语句很难做到这一点。使用lambda而不是的另一个原因def当函数不会再次使用时如果我们不想稍后再次调用该函数,则无需为该函数命名。例如,考虑以下代码:

def apply_to_each(transform, in_container): out_container = list() for idx, item in enumerate(container, 0): out_container[idx] = transform(item) return out_container

现在我们进行以下调用:

squares  = apply_to_each(lambda x: x**2 range(0, 101))
Run Code Online (Sandbox Code Playgroud)

请注意,lambda x: x**2没有给出标签。这是因为我们以后可能不会再调用它,这只是我们暂时需要的一些简短的东西。

事实上,lambda 函数不需要命名,因此有另一个名称来描述它们:“匿名函数”。

另请注意,lambda 语句类似于函数调用,因为它们返回对其创建的函数的引用。以下行为是非法的:

apply_to_each(def foo(x): x**2 ,  range(0, 101))
Run Code Online (Sandbox Code Playgroud)

然而,apply_to_each(lambda x: x**2 range(0, 101))就很好了。

因此,当我们想要一些简短的、甜蜜的并且以后可能不想再次使用的东西时,我们使用代替和代替长变量名lambdadef_


mik*_*iku 6

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

是的,它是一个返回True的函数(或lambda).的下划线,这通常是用于忽略可变的占位符,在这种情况下是不必要的.

这种函数的一个示例用例(几乎没有任何作用):

dd = collections.defaultdict(lambda: True)
Run Code Online (Sandbox Code Playgroud)

当用作defaultdict的参数时,您可以将其True作为常规默认值.


Łuk*_*ski 6

Underscore是一个Python约定,用于命名未使用的变量(例如,静态分析工具不会将其报告为未使用的变量).在您的情况下,lambda参数未使用,但创建的对象是始终返回的单参数函数True.所以你的lambda 在数学上有点类似于常量函数.


hya*_*des 5

Lambda 表示函数。上面的语句和写一样

def f(_):
    return True
Run Code Online (Sandbox Code Playgroud)

对于 lambda,需要存在一个变量。所以你传递给它一个名为_(同样你可以传递xy..)