Python的lambda没有变量?

时间:2015-04-21 08:51:55

标签: python lambda

以下代码有何作用?

a = lambda _:True

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

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

7 个答案:

答案 0 :(得分:97)

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

的Python:

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

>>> l("foo")
True

所以这个lambda 确实需要一个参数。如果你想要一个没有参数的lambda 总是返回True,那就这样做:

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

  

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

是的,它是一个返回True的函数(或lambda)。在这种情况下,underscore通常是被忽略变量的占位符。

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

dd = collections.defaultdict(lambda: True)

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

答案 3 :(得分:4)

Lambda表示一个函数。 以上陈述与撰写

相同
def f(_):
    return True

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

答案 4 :(得分:3)

下划线_是有效的标识符,在此用作变量名称。对于传递给函数的参数,它总是返回True

>>>a('123') 
True

答案 5 :(得分:2)

以下是有问题的代码行:

a = lambda _:True

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

my_var = 5
print(my_var)

你可以写:

_ = 5
print(_)

但是,有一个原因是_被用作参数名称的名称而不是xinput。我们马上就会谈到这一点。

首先,我们需要知道lambda关键字构造一个函数,类似于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 = list()     对于idx,枚举项(容器,0):        out_container [idx] =变换(项目)     return 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_而不是长变量名称,当我们想要一些简短,甜蜜的东西时,可能以后不再需要使用。

答案 6 :(得分:-1)

Perc =λx,y:浮点数(x)* 100 /浮点数(y)

谁能解释它在python中的用途