Python 函数声明和变量赋值
我想问一个关于函数如何分配给变量的问题 我是Python初学者,学习函数 考虑以下代码块: 我知道Python 函数声明和变量赋值,python,lambda,Python,Lambda,我想问一个关于函数如何分配给变量的问题 我是Python初学者,学习函数 考虑以下代码块: 我知道lambda是一个匿名函数,只有一个表达式被计算和返回 这在myfunc(n)中显示: myfunc接受一个参数,在本例中为2,因此任何数字a都将加倍 然而,我在这里感到困惑 在这方面: mydoubler = myfunc(2) 我以为我们将myfunc的结果分配给mydoubler,但在print语句中: print(mydoubler(11)) 我们正在传递一个参数11,但我们从未在函数声
lambda
是一个匿名函数,只有一个表达式被计算和返回
这在myfunc(n)
中显示:
myfunc
接受一个参数,在本例中为2,因此任何数字a
都将加倍
然而,我在这里感到困惑
在这方面:
mydoubler = myfunc(2)
我以为我们将myfunc
的结果分配给mydoubler
,但在print语句中:
print(mydoubler(11))
我们正在传递一个参数11
,但我们从未在函数声明的任何地方指定参数a
python代码如何知道在本例中,print语句内部的
11
与a
关联?在本例中,您实际将doubler函数分配给了mydoubler
:
mydoubler = myfunc(2)
您还指定了参数
a
,名称为2。因此,当您将一个数字传递给mydoubler()
函数时,Python知道您已经指定了n
由lambda:a*n
创建的函数是一个闭包。当函数被称为mydoubler(11)
时,它使用11
作为a
的值,并使用2
(计算lambda:a*n
时myfunc
内部n
的值作为n
的值
mydoubler
的行为就像它被定义为
def mydoubler(a):
return a * 2
您可以看到,值2
通过一点挖掘存储在函数中:
>>> mydoubler.__closure__[0].cell_contents
2
(事实上,您可以改变这一点,尽管您只有在希望代码变得极其复杂的情况下才会这样做:
>>> mydoubler.__closure__[0].cell_contents = 3
>>> mydoubler(2)
6
)来自
myfunc(2)
的返回值与此lambda等效
lambda a: a * 2
lambda接受1个参数,并将其加倍。在本例中,当您调用它时,通过将它赋给名称mydoubler
,您传递给它的任何参数都是a
,lambda接受的一个参数
等效代码:
mydoubler = lambda a: a * 2
output = mydoubler(11) # returns 11 * 2
print(output) # prints 22
不是“完全”;硬编码参数和使用闭包中存储的值之间有区别。
lambda a: a * 2
mydoubler = lambda a: a * 2
output = mydoubler(11) # returns 11 * 2
print(output) # prints 22