什么是闭包
Python中的闭包是一个比较模糊的概念,有很多朋友都认为不好理解,但是随着深入学习,就会发现闭包无论如何都是需要去理解的,下面我将自己对闭包的理解进行阐述,希望能够对你有所帮助 ~
我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包。
闭包的格式
如下:
def 外层函数(参数):
def 内层函数():
print("内层函数执行", 参数)
return 内层函数
内层函数的引用 = 外层函数("传入参数")
内层函数的引用()
外层函数中的参数,不一定要有,据情况而定,但是一般情况下都会有并在内函数中使用到
闭包的实例
如下:
def outfunc(a): # 定义外函数
def infunc(b): # 定义内函数
return a*b # 内函数的返回值
return infunc # 外函数的返回值,返回内函数的对象
func_instance = outfunc(8) # 外函数的实例,是一个function对象
print(type(func_instance)) # 打印外函数实例的类型
res = func_instance(10) # 外函数实例的调用
print(res)
输出
➜ test git:(master) ✗ python3 testpy.py
<class 'function'>
80
在上面的代码中,内函数直接使用了外函数的变量值,那如果想要在内函数中对外函数的变量值进行修改,怎么操作呢?
修改外函数的变量值
想要修改外函数的变量值,需要用到nonlocal关键字。
def outfunc(a):
def infunc(b):
nonlocal a
a = a*2
return a*b
return infunc
func_instance = outfunc(8)
print(type(func_instance))
res = func_instance(10)
print(res)
输出
➜ test git:(master) ✗ python3 testpy.py
<class 'function'>
160
如上即可。
闭包的使用场景
Python中,闭包的主要用途就是用于装饰器的实现。后续讲解。
还有就是可以简化参数重复传递,比如:
def add(a,b,c):
print(a*b*c)
add(1,2,1)
add(1,2,2)
add(1,2,3)
add(1,2,4)
add(1,2,5)
输出
➜ test git:(master) ✗ python3 testpy.py
2
4
6
8
10
你会发现,a和b是固定不变的,我们怎么样才能减少a和b的传参,而只改变c的值呢?这个时候闭包就起到了作用。
def addNew(a,b):
def addC(c):
return a*b*c
return addC
func_ins = addNew(1,2)
print(func_ins(1))
print(func_ins(2))
print(func_ins(3))
print(func_ins(4))
print(func_ins(5))
输出
➜ test git:(master) ✗ python3 testpy.py
2
4
6
8
10