闭包函数

0.什么叫做闭包

闭包:内部函数调用外部函数的变量(非全局变量),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

  

posted @ 2018-03-10 21:45  王剑威  阅读(124)  评论(0编辑  收藏  举报