1.先看下闭包的特点
闭包条件:
1.外部函数中定义了一个内部函数
2.外部函数有返回值
3.返回的值是:内部函数名
4.内部函数还引用外部函数的变量值
因此最基础的闭包结构如下:
#闭包
def func1():#外部函数
a=100 #外部函数的变量
def inner_func1():#内部函数
b=99 #内部函数变量
print(a,b)#引用外部函数的变量
return inner_func1#返回内部函数名
s=func1() #s接收func1返回的inner_func1
s() #等价于调用inner_func1
运行结果为:
100 99
2.在基础版上增加入参,即带参数的闭包
#带参数的闭包
def func2(a,b):#两个入参a,b
c=100 #外部函数参数
def inner_func2():#内部函数
d=3 #内部函数的参数
sum=a+b+c+d #引用外部函数的参数
print(sum)
return inner_func2 #返回内部函数名
f=func2(1,6)#f接收func2返回的inner_func2
f() #等价于调用inner_func2
运行结果为:
110
3.上面两个例子中内部函数都只是引用了外部函数的变量而已,并没有对外部函数的变量进行修改操作,如果需要修改外部函数变量值的话,需要了解下nonlocal,global声明
nonlocal 变量名 #内部函数可修改外部函数的不可变变量
global 变量名 #内部函数可修改全局的不可变变量
#闭包内部函数的变量访问
x=10 #全局变量
def func3():#外部函数
y=9 #外部函数变量
def inner_func3():#内部函数
nonlocal y #内部函数修改外部函数的不可变变量时,需要在内部函数中声明:nonlocal 变量名
y=y+1 #修改外部函数变量值
global x #内部函数修改全局的不可变变量时,需要在内部函数声明:global 变量名
x=x+1 #修改全局变量值
z=8
print(x,y,z)
return inner_func3 #返回内部函数名
q=func3()#q接收func3返回的inner_func3
q()#等价于调用inner_func3
运行结果为:
11 10 8
闭包还有一个主要的特点是:闭包是理解装饰器的基础,装饰器请看《python之装饰器》