python中闭包和nonlocal声明
一、闭包
通俗来讲,闭包可以理解成就是一种函数。如何创建闭包?
1、创建一个外部函数
2、创建一个内部函数 (函数嵌套)
3、内部函数使用外部函数的参数,外部函数返回内部函数名
例:
使用闭包实现两数之和:
def founcOut(num1):
def founcIn(num2):
return num2 + num1
return founcIn
f = founcOut(100)
r = f(100)
print(f,'\n',r)
>>>
<function founcOut.<locals>.founcIn at 0x00000173C422A160>
200
由例子可以看出基本的闭包结构,值得注意的是founcOut返回的是founcIn()内部函数,并将返回赋值给f(在python中函数也是对象)。此时f就是函数founcIn(),所以再调用f并赋值num2=100,从而算出两数之和。
闭包还有其他一些应用,并且是装饰器的基础
注:闭包的运行机制和详细原理可参考《Python学习手册》《流畅的PYTHON》
二、nonlocal声明
nonlocal和global的作用很相似。继续上面例子,如果我想在内部函数中修改参数num1的值,系统会报错(具体参考上述两本书)。所以在内部函数中使用nonlocal声明即可修改外部函数的参数。
def founcOut(num1):
def founcIn(num2):
nonlocal num1
num1 += 100
return num2 + num1
return founcIn
f = founcOut(100)
r = f(100)
print(f,'\n',r)
>>>
<function founcOut.<locals>.founcIn at 0x00000173C422A160>
300