0012days(闭包)

2018-07-17

闭包:内部函数调用外部函数的变量(非全局变量),python把这个情况成为闭包.

# def func1():
# 	a = 'Sath'
# 	def func2():
# 		print(a)
# 	return func2

  

1.#### 闭包的优点 ####

# 1.常驻内存
# 一个函数运行完之后,python解释器会回收内存,但是当一个函数的内部还有函数,并且这个内部函数引用了外函数
# 的变量,那么python会认为这是一个闭包,就会将外函数的变量绑定给内函数,供内函数使用,不会随着外函数的结束
# 而销毁这个变量,会留在内存中,也就是常驻内存.

# 2.防止其他程序改变这个函数内的变量
# 当你的函数调用一个全局变量时,这个全局变量是所有人都可以用的
# 不能保证这个变量的唯一性和可信赖性,容易因为变量的问题程序出现bug
# 实际上就是在全局变量中,留出一块地方供你的程序使用,别人的非法手段进不到你的程序中,也就是开发封闭性



2.#### 如何查看一个函数是否为闭包 ####
# 可以使用"__closure__"来检测函数是否为闭包,返回"cell"就是闭包,返回"None"就不是闭包
# def func1():
# 	a = 'Sath'
# 	def func2():
# 		print(a)
# 	print(func2.__closure__)
# 	return func2
# func1()
# 返回值如下
# (<cell at 0x0000000002177588: str object at 0x0000000002807260>,)

  

3.#### 当内部函数没有调用外部函数的变量时就不是闭包 ####

# def func1():
# 	a = 'Sath'
# 	def func2():
# 		print(123)
# 	print(func2.__closure__)
# 	return func2
# func1()
# 当返回None时证明这不是一个闭包
# None

  

4.#### 如何在函数外部调用内部函数 ###

def func1():
	name = 'sath'
	def inner():
		print(name)
	return inner    # 内部函数最为外部函数的返回值

ret = func1()       # 就相当于"ret = inner"
ret()               # 想平常调用函数一样就可以
# 结果:sath

  

猜你喜欢

转载自www.cnblogs.com/594504110python/p/9326162.html