python闭包

基于这个链接,结合自己的经验来理解闭包。
https://blog.csdn.net/u013380694/article/details/90019571

A. 都是对象,函数里面产生一个内部函数的对象,把内部函数当做结果返回.

def Outer():
	def Inner():
		pass
	return Inner
f1 = Outer()
f2 = Outer()

f1和f2是两个不同的函数对象

B. 内部函数可以一直使用外部函数的变量。

一个函数结束的时候,会把自己的临时变量都释放给内存,之后变量都不存在了。但是闭包是一个特别的情况。外部函数发现,自己的临时变量会在将来的内部函数中用到,自己在结束的时候,返回内函数的同时,会把外函数的临时变量和内函数绑定在一起。所以外函数已经结束了,调用内函数的时候仍然能够使用外函数的临时变量。

def Outer():
	a = 5
	def Inner():
		print(a)			#这里使用了外部变量
	return Inner

C. 外函数变量的修改

外函数变量可以直接引用,但是不能修改,比如

def Outer():
	a = 5
	def Inner():
		a -= 1			#这里会报错
		print(a)			#这里使用了外部变量
	return Inner

所有,需要用nonlocal关键字来修饰

def Outer():
	a = 5
	def Inner():
		nonlocal a
		a -= 1
		print(a)			#这里使用了外部变量
	return Inner

D. 闭包函数被多次调用的情况

同一个闭包函数被多次调用时,其外部变量的变化会被保存下来。

def Outer(par):
	a = par
	def Inner():
		nonlocal a
		a -= 1
		print(a)			#这里使用了外部变量
	return Inner
fun = Outer(5)
fun()				#这里输出4
fun()				#这里输出3,因为a已经在前一次调用时候从5变成了4

E. 比用的个人应用

给出一系列系数,产生一个多项式函数
比如给出c4,c3,c2,c1,c0,得到
f(x) = c4 * x^4 + c3 * x^3 + c2 * x^2 + c1*x+c0

def get_poly_fun(c_list):
	#外函数,c_list为系数list
	#内函数,参数为x
	def poly_func(x):
			ret = 0								#待返回的结果
			degree = len(c_list) - 1	#确定最高次的次数
			for c in c_list:					#确定函数的算法
				ret += c*x**degree
				degree -= 1
			return ret							#返回结果
	return poly_func						#返回内函数

#测试
c_list = [1,2,1]
poly_func = get_poly_fun(c_list)		#poly_func应该是X^2 + 2 *X + 1
print(poly_func(1))								#这里输出4
print(poly_func(-1))								#这里输出0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值