闭包:
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。
一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。
在基本的python语法当中,一个函数可以随意读取全局数据,但是要修改全局数据的时候有两种方法:
方法1 global 声明全局变量 。
方法2 全局变量是可变类型数据的时候可以修改。在闭包内函数也是类似的情况。在内函数中想修改闭包变量(外函数绑定给内函数的局部变量)的时候:
方法1 nonlocal 关键字声明, 表示这个变量不是局部变量空间的变量,需要向上一层变量空间找这个变量(python3)。
方法 2 把闭包变量修改成可变数据类型,比如列表。还有一点需要注意:使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量。
1.利用闭包返回一个计数器函数,每次调用它返回递增整数:
#方法.1 利用nonlocal:
def createCounter():
j = 0
def counter():
nonlocal j
j+=1
return j
#方法.2 利用可变数据类型-列表:
def createCounter():
s = [0]
def counter():
s[0] += 1
return s[0]
return counter
#方法3.利用生成器:
def createCounter():
def g():
n = 0
while True:
n = n + 1
yield n
it = g()
def counter():
return next(it)
return counter