闭包:函数式编程重要的语法结构
如果在一个内部函数里,对外部作用域(但不是全局变量)的变量进行引用,那么内部函数就被称为闭包,举例如下
>>> def funX(x):
def funY(y):
return x * y #这里的内部函数funY对外部作用的变量x进行了引用,就成内部函数funY为闭包
return funY
>>> i = funX(5)
>>> i(8)
40
>>> funX(5)(8)
40
#同样的,闭包中外部函数的变量与内部函数的变量相当于全局变量与局部变量的关系,一旦走出函数,就不能再调用内部函数
#pyhton3有一种新的解决方案可以在闭包中改变外部作用域的值,关键字是 nonlocal,举例如下
例1:
>>> def myfun():
x = 5
def myfun2():
x += 5 #这里试图改变外部作用域的变量,产生了错误
return myfun1()
>>> myfun()
Traceback (most recent call last):
File "<pyshell#53>", line 1, in <module>
myfun()
File "<pyshell#52>", line 5, in myfun
return myfun1()
NameError: name 'myfun1' is not defined
例2:
>>> def myfun():
x = 5
def myfun2():
nonlocal x #这里使用nonlocal关键字通知python将会改变外部区域的变量
x+=5
print(x)
return myfun2()
>>> myfun()
10
例3:
def funX():
x = 5
def funY():
nonlocal x
x += 1
return x
return funY
a = funX()
print(a())
print(a())
print(a())
print(a())
6
7
8
9
正常来讲全局变量每一次循环都会重新开始,但是这里a的值一直没有被释放,变量x也是基于每一次的基础上进行运算。