python中闭包的初步理解

本人是初学者一枚,写下笔记分享自己的一些见解,若有错误之处希望各位大神多多海涵,并请指出理解有误的地方,谢谢
闭包:相关参数和变量都保存在返回函数中的就是闭包。
如:

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__)

输出结果:
closure结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值