本人是初学者一枚,写下笔记分享自己的一些见解,若有错误之处希望各位大神多多海涵,并请指出理解有误的地方,谢谢
闭包:相关参数和变量都保存在返回函数中的就是闭包。
如:
def layz_sum ( *args ) : #内部函数sum可以引用外部函数layz_sum的参数args
def sum ( ) :
s = 0
for n in args :
s = s + n
return s
return sum
对于闭包函数的调用:
f = layz_sum
print ( f ) #返回的只是求和函数
函数输出结果:
f = layz_sum ( 1,2,3,4,5 )
print ( f ( ) ) #返回的是求和结果
函数输出结果:
——————————————————以上的看不懂?接下来分析一下————————————————————————
一、闭包的必要条件
从上面闭包的例子中,不难总结出一些规律:
- 闭包函数中必须返回一个函数对象
- 闭包函数返回的函数必须引用外部变量
二、闭包的作用域
def outer(a): #outer是外部函数,a和b是外部函数的临时变量
b=10
def inner(): #inner是内部函数
print(a+b)
return inner
demo=outer(5) #demo存了外部函数的返回值,相当于执行了inner内部函数,也就是知道a=5,b=10以及inner函数的地址
print(demo())
正常来说,一个函数结束之后就会把自己的临时变量释放,但闭包是一种特殊情况,外部函数outer发现自己的临时变量会在将来被内部函数inner使用,所以在返回内部函数对象的时候,就把自己的临时变量与内部函数绑在一起。这就是为什么即使外部函数结束了内部按函数还可以引用它(外部函数)的变量。
三、利用闭包保存运行环境
对比一下两种情况:
- 普通函数
_list=[]
for i in range(3): #这里说一下for循环在python与c语言之间的不同:在python中,i即使在for的外面也不会释放
def func(i):
return a+i
_list.append(func(i))
for f in _list:
print(f) #得到的输出结果:1、1、1
- 闭包函数
_list=[]
for i in range(3):
def func(i):
def f_closure(a):
return 1+a
return f_closure
_list.append(func(i))
for f in _list:
print(f) #得到的输出结果:1、2、3
可以看出闭包保存了循环过程中i的值,也就是保存了运行环境
四、闭包中的__closure__ 与 nonlocal
- closure
返回一个元祖的对象,列出闭包引用的外部变量
def line_conf():
a=1
b=2
def line(x):
print(a*b)
return line
L=line_conf()
print(L.__closure__)
输出结果:
- nonlocal
表示这个变量是可变类型的数据,用于在在内函数中修改闭包变量
那么这个闭包是在python中有什么作用呢?最主要是用于修饰器
------------------------------------------------------------------华丽分界线--------------------------------------------------------------------------------
感谢以下文章给予我的帮助:
谈谈自己的理解:python中闭包,闭包的实质
[Python小记] 通俗的理解闭包 闭包能帮我们做什么?