函数闭包

一般函数执行结束时该函数的局部变量会消失,假如,我们希望先保留函数中的临时局部变量,这时候就可以用上闭包了,
闭包其实就是能够读取其他函数内部变量的函数,闭包实际就是python装饰器的原理

我们在开发中能尽量避免使用全局变量的就尽量避免使用。因为不同模块,不同函数都可以自由的访问全局变量,可能会造成全局变量的不可预知性。
闭包避免了使用全局变量,此外,闭包允许将函数与其所操作的某些数据(环境)关连起来。而且使用闭包,可以使代码变得更加的优雅

形成闭包的条件:
1.在一个外函数中定义了一个内函数
2.在内函数引用了外函数的临时变量
3.外函数的返回值是内函数的引用

image.png

如何验证函数是否是闭包?

可以通过closure属性,如果函数是闭包的话,会返回一个由于cell组成的元组对象,cell对象的 cell_contents 属性就是存储在闭包中的变量

  1. def use_logging(func):
  2. def inner(*args, **kwargs):
  3. logging.info("{} is running".format(func.__name__))
  4. return func(*args, **kwargs)
  5. return inner
  6. f = use_logging(func)
  7. print(f.__closure__)
  8. print(f.__closure__[0].cell_contents)
  9. -----------
  10. #(<cell at 0x0000015984AE1438: function object at 0x0000015984ADBAF8>,)
  11. #<function func at 0x0000015984ADBAF8>