先来看闭包一个简单的例子:
假如有一个式子: y = kx + b,我们要算这一条线上的很多点,甚至要算很多线上的很多点,当然要用函数,但是每次都传三个参数也太麻烦了,全局变量也可以实现,但是每次还是要修改,也很麻烦,也可以用缺省参数,如果使用的是默认的那也好说,如果不是默认值还是要传很多参,还有一个方法就是用实例对象,但是一个创建出来就要考虑到还有魔法属性什么的,占用空间太大,这时就可以用闭包来实现:
def line_6(k, b):
def create_y(x):
print(k * x + b)
return create_y
line_6_1 = line_6(1, 2) # 相当于创建了一个闭包,指向了它
line_6_1(0) # 向闭包中传递参数,调用它
line_6_1(1)
line_6_1(2)
line_6_2 = line_6(11, 22) # 另一个闭包,并且指向了它
print(line_6_2)
line_6_2(0)
line_6_2(1)
line_6_2(2)
这里有个注意点:return 后面返回的是引用,调用的话还是在外部调用。这样我们就可以更好的理解闭包:一个函数中嵌套着另一个函数的定义,真正使用的也是内部函数,往往内部函数又要用到外部变量。这样子内部函数和要使用的外部函数的变量共同组成的空间就构成了一个闭包。也就是说,闭包是简单的功能+数据,跟实例对象类似但是更简单,数据、内存等也更少。
如何修改闭包中的值:
x = 300
def test1():
x = 200
def test2():
nonlocal x #如果没有这句话,下一句中默认在本函数中先找,找到了但是却发现在后面,之前没有定义,则报错
print("---1---x = %d" % x)
x = 100
print("---2---x = %d" % x)
return test2
t1 = test1()
t1()
#结果:
#---1---x = 200
#---2---x = 100
这段代码中要注意的就是nonlocal关键字,声明非局部变量,使用这个关键字所要注意的点:
1.外部必须有这个量
2.在内部函数声明nonlocal变量之前不能出现同名变量
3.内部修改这个变量,在外部有这个变量的第一层函数中生效