谁能解释一下 Python 中函数的关闭?
Can anybody explain about the closure of function in Python?
Python
任何人都可以帮助我理解这段代码,我是 Python 的新手,这个功能是如何工作的?
def makeInc(x):
def inc(y):
return y + x
return inc
incOne = makeInc(1)
incFive = makeInc(5)
print(incOne(5)) # returns 6
print(incFive(5)) # returns 10
这里发生的事情是 makeInc()
returns 指向 inc()
的特定实现的函数句柄。因此,调用 makeInc(5)
将 inc(y)
中的 x
“替换”为 5
和 returns 该函数的可调用句柄。此句柄保存在 incFive
中。您现在可以调用定义的函数 (inc(y)
)。由于您之前设置了 x=5,因此结果将是 y+5
.
高阶函数
像 makeInc
这样的函数反过来 return 另一个函数被称为 higher order functions。通常,已知函数接受数据作为输入,return 数据作为输出。使用高阶函数,函数而不是数据,return 代码作为输出或接受代码作为输入。这段代码被包装到一个函数中。在 Python 中,函数首先是 class 公民,这意味着函数就像数据一样可以传递。例如:
myvariable = print
注意,我如何将 print
分配给 myvariable
以及我如何在 print
之后删除括号 没有括号的函数称为函数对象。这意味着 myvariable
现在只是 print
的另一个名称:
print("Hello World!")
myvariable("Hello World!")
以上两个语句做的事情完全一样。可以分配给变量的内容也可以从函数 returned:
def myfunction():
return print
myfunction()("Hello World!");
现在让我们看看你的例子:
def makeInc(x):
def inc(y):
return y + x
return inc
makeInc
是一个接受名为 x
的参数的函数。然后它定义了另一个名为 inc
的嵌套内部函数,它接受一个名为 y
的参数。嵌套函数的特点是它们也可以访问封闭函数的变量。在这里,inc
是内部函数,但它可以访问 x
,这是封闭的外部作用域的一个变量。
最后一条语句 return inc
return 是 makeInc
调用者的内部函数。 makeInc
本质上是在根据接收到的参数创建自定义函数。
例如:
x = makeInc(10)
makeInc
将首先接受 10,然后 return 接受参数 y
的函数,并将 y
递增 10。
这里,x
是一个接受任何参数 y
然后将其递增 10 的函数:
x(42) # Returns 52
nonlocal
但是,使用嵌套函数时需要注意:
def outer():
x = 10
def inner():
x = 20
inner()
print(x) # prints 10
在这里,您会假设最后一个 print
语句将打印 20。但不是!当您在内部函数中分配 x = 20
时,它会创建一个名为 x
的新局部变量,该变量被初始化为 20。外部 x
保持不变。要修改外x
,使用nonlocal
关键字:
def outer():
x = 10
def inner():
nonlocal x = 20
inner()
print(x) # prints 20
如果你是直接读取inner()
里面的x
而不是赋值给它,你不需要nonlocal
.
Python
任何人都可以帮助我理解这段代码,我是 Python 的新手,这个功能是如何工作的?
def makeInc(x):
def inc(y):
return y + x
return inc
incOne = makeInc(1)
incFive = makeInc(5)
print(incOne(5)) # returns 6
print(incFive(5)) # returns 10
这里发生的事情是 makeInc()
returns 指向 inc()
的特定实现的函数句柄。因此,调用 makeInc(5)
将 inc(y)
中的 x
“替换”为 5
和 returns 该函数的可调用句柄。此句柄保存在 incFive
中。您现在可以调用定义的函数 (inc(y)
)。由于您之前设置了 x=5,因此结果将是 y+5
.
高阶函数
像 makeInc
这样的函数反过来 return 另一个函数被称为 higher order functions。通常,已知函数接受数据作为输入,return 数据作为输出。使用高阶函数,函数而不是数据,return 代码作为输出或接受代码作为输入。这段代码被包装到一个函数中。在 Python 中,函数首先是 class 公民,这意味着函数就像数据一样可以传递。例如:
myvariable = print
注意,我如何将 print
分配给 myvariable
以及我如何在 print
之后删除括号 没有括号的函数称为函数对象。这意味着 myvariable
现在只是 print
的另一个名称:
print("Hello World!")
myvariable("Hello World!")
以上两个语句做的事情完全一样。可以分配给变量的内容也可以从函数 returned:
def myfunction():
return print
myfunction()("Hello World!");
现在让我们看看你的例子:
def makeInc(x):
def inc(y):
return y + x
return inc
makeInc
是一个接受名为 x
的参数的函数。然后它定义了另一个名为 inc
的嵌套内部函数,它接受一个名为 y
的参数。嵌套函数的特点是它们也可以访问封闭函数的变量。在这里,inc
是内部函数,但它可以访问 x
,这是封闭的外部作用域的一个变量。
最后一条语句 return inc
return 是 makeInc
调用者的内部函数。 makeInc
本质上是在根据接收到的参数创建自定义函数。
例如:
x = makeInc(10)
makeInc
将首先接受 10,然后 return 接受参数 y
的函数,并将 y
递增 10。
这里,x
是一个接受任何参数 y
然后将其递增 10 的函数:
x(42) # Returns 52
nonlocal
但是,使用嵌套函数时需要注意:
def outer():
x = 10
def inner():
x = 20
inner()
print(x) # prints 10
在这里,您会假设最后一个 print
语句将打印 20。但不是!当您在内部函数中分配 x = 20
时,它会创建一个名为 x
的新局部变量,该变量被初始化为 20。外部 x
保持不变。要修改外x
,使用nonlocal
关键字:
def outer():
x = 10
def inner():
nonlocal x = 20
inner()
print(x) # prints 20
如果你是直接读取inner()
里面的x
而不是赋值给它,你不需要nonlocal
.