Python的带下划线的lambda参数?


84

以下代码做什么?

a = lambda _:True

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

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


10
对于那些无参数的lambda,语法为lambda : True
Robino

17
我对这篇文章不满意的是,问题标题谈论的是“没有变量”的lambda函数,但是问题正文以及几乎所有答案都给出了具有一个变量/参数的lambda函数的示例。该变量恰好具有一个奇怪的名称_,而不是xora或其他名称。如果有人想知道如何编写不带参数的lambda函数,方法如下:定义如下:my_lambda = lambda : 255。这样称呼:x = my_lambda()您可以将其替换255为所需的任何返回值。
牙签海葵

2
@ToothpickAnemone很好的回复!这些天,我大多使用没有变量的lambda来初始化defaultdicts。希望它对阅读此主题的人们有用。ht = {} ht = defaultdict(lambda:0,ht)
躺猫

Answers:


143

_是变量名。尝试一下。(此变量名称通常是忽略变量的名称。可以说是占位符。)

蟒蛇:

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

>>> l("foo")
True

因此,此lambda确实需要一个参数。如果您想要不带参数的lambda总是返回True,请执行以下操作:

>>> m = lambda: True
>>> m()
True

7
@dopatramanPython 3.6.2在under下对其进行了测试,Mac OS 10.12并且可以正常工作。
winklerrr

6
也许您可以添加一些信息,即_当确实不需要变量本身时,通常使用变量名。这就像一个“扔掉变量”,只是一个没有用的占位符。
winklerrr

1
@dopatraman在Ipython中,_保留最后一个表达式返回的值。由于这个原因,我避免使用_。 stackoverflow.com/questions/17580289/…–
塔罗·基里塔尼

7

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


不仅蟒蛇的转换,这是一个语言无关,并强调是用来表示一个变量是暂时的或无关紧要
斯瓦沃米尔Lenart

6

它似乎是一个返回True的函数。

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

此类函数的示例用例(几乎不执行任何操作):

dd = collections.defaultdict(lambda: True)

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


4

Lambda表示功能。以上声明与写作相同

def f(_):
    return True

对于lambda,需要存在一个变量。所以,你传递一个叫做变量_(同样,你可以通过xy..)


3

下划线_是有效的标识符,在这里用作变量名。它将始终返回True传递给函数的参数。

>>>a('123') 
True

您好,感谢您的快速回复。所以它的匿名函数总是返回true?
2015年

@laycat; 是。它将始终返回true。
haccks 2015年

2

下面是有问题的代码行:

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,而不是defSF时功能将无法再使用。如果我们不想稍后再调用该函数,则无需为该函数命名。例如,考虑以下代码:

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_而是一个长变量名的时候,我们想要的东西短,甜,可能不会再希望以后使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.