在回顾W3Schools Python教程时,我对他们的lambda示例感到困惑。
变量“ a”的值从何而来?当然,“ a”是lambda-但是它从哪里得到值?
def myfunc(n):
return lambda a : a * n
mytripler = myfunc(3)
print(mytripler(11))
如果我自己调用print(myfunc(3)),则会收到错误消息。仅当该功能被另一个功能调用时,该功能才起作用。 lambda如何知道这一切?
我担心我缺少关于lambda函数的一些基本知识。
答案 0 :(得分:5)
Lambda只是完整声明的简写形式。这使您的示例在功能上与此相同:
def myfunc(n):
def inner(a):
return a * n
return inner
lambda是一个函数,当您调用它时,会为其提供一个参数(在此示例中为a)。
答案 1 :(得分:3)
myfunc(3)
的作用是将3分配给n
,然后在lambda表达式中使用此值。因此表达式变为3*a
。您的lambda函数具有一个自变量a
。当您return lambda a : a * n
时,您的mytripler
充当对象(函数),其参数为a
,并且操作是计算a*3
。所以最后,当您致电
mytripler(11)
您将11分配给自变量a
,从而得到33
答案 2 :(得分:1)
a
被分配了值11。
认为lambda函数的定义是“给定输入时,将其返回”。您可以输入任何名称,因此我们将其命名为x。 lambda x : x + 1
的意思是“给定我们将称为x
的输入:返回x + 1
”。
您有一个额外的函数层返回lambda,但是如果我们将其分解,myfunc
的目的是动态生成lambda函数。调用myfunc(3)
时,您手中拥有的是一个lambda函数,看起来像这样:lambda a : a * 3
。这就是变量mytripler
所包含的内容。如果您使用print(mytripler)
,则会看到类似以下内容的内容:<function myfunc.<locals>.<lambda> at 0x...>
,它告诉您这是一些lambda函数。 mytripler
包含一个函数,而不是一个值。
此lambda函数有什么作用?它说:“给定一个我们称为a
的输入参数:返回a * 3
”。
您如何使用函数?你叫他们!并随调用一起发送任何参数。我们的lambda函数需要几个参数?但是,在lambda函数定义中,有许多变量在冒号之前,在这种情况下为a
。因此,我们通过发送一个参数mytripler
来调用存储在mytripler(11)
中的lambda。 11是lambda函数的输入,该函数首先分配给a
并返回a * 3 -> 33
。
您可能有一个lambda,它需要2个输入,我们将其称为x
和y
:
adder = lambda x, y : x + y
这个lambda做什么?它说:“给定2个我们称为x
和y
的输入:返回它们的总和”。你怎么称呼它?您必须使用两个参数调用adder
:adder(2,3)
返回5
。将2
分配给x
,将3
分配给y
,然后该函数返回它们的总和。
如果我们叫adder(1)
怎么办?
TypeError: <lambda>() missing 1 required positional argument: 'y'
由此您可以看到Python知道lambda函数从其定义中期望有多少个输入参数,并且如果不先获取其所需的所有参数就无法工作。