什么是闭包
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