函数声明和变量赋值

2024-06-16 10:18:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我想问一个关于函数如何分配给变量的问题

我是Python初学者,学习函数

w3schools

考虑下面的代码块
def myfunc(n):
  return lambda a : a * n

mydoubler = myfunc(2)

print(mydoubler(11))

我知道lambda是一个匿名函数,只有一个表达式被计算和返回

这显示在myfunc(n)中:

return lambda a: a * n

myfunc接受一个参数,在本例中为2,因此任何数a都将加倍

然而,我在这里感到困惑

在这方面:

mydoubler = myfunc(2)

我以为我们将myfunc的结果分配给mydoubler,但在print语句中:

print(mydoubler(11))

我们正在传递一个参数11,但我们从未在函数声明的任何地方指定参数a

python代码如何知道print语句中的11a关联


Tags: lambda函数代码声明参数return表达式def
3条回答

lambda a: a * n创建的函数是一个闭包。当函数被称为mydoubler(11)时,它使用11作为a的值,使用2(计算lambda a: a * nn内部myfunc的值)作为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

在这种情况下,您实际上将doubler函数分配给了mydoubler

mydoubler = myfunc(2)

您还指定了参数a,namly 2。因此,当您向mydoubler()函数传递一个数字时,Python知道您已经指定了n

相关问题 更多 >