闭包的概念可以简单概括为内部函数内引用了外部函数作用域里变量的引用(非全局变量),则称这个内部函数为闭包。
python中的闭包需要满足三个条件:
- 必须是一个嵌套的函数。
- 闭包必须返回嵌套函数。
- 嵌套函数必须引用一个外部的非全局的局部自由变量。
为了方便理解,可以使用一个例子简单解释一下
def outer(a): b = 3 # outer函数内的变量,非全局 def inner(): print(a+b) # 引用了inner函数外的变量 return inner # 返回内函数的引用 if __name__ == '__main__': out = outer(3) out()
闭包的用处:
1. 可做装饰器使用。比如计算某个函数运行时间
def timer(func): def wrapper(): start_time = time() func() stop_time = time() print('run time is %f'%(stop_time-start_time)) return wrapper @timer def fun(): print('start-----') sleep(3) print('end-------') if __name__ == '__main__': fun()
当然不用装饰器的话,可以使用闭包调用方法
t = timer(fun) t()
有参数闭包代码
def login(msg): def auth(func): def wrapper(*args, **kwargs): if msg['name'] == 'admin' and msg['psd'] == 'admin': print('authention successfull!') else: print('authention failed!') return wrapper return auth msg = {'name':'admin','psd':'admin12'} @login(msg) def fun(): print('start-----') sleep(3) print('end-------') if __name__ == '__main__': fun()
2. 面向对象编程,可以使用闭包实现实现面向对象
举个例子
# 用类实现一个求和 class Add(object): def __init__(self, a, b): self.a = a self.b = b def _add(self): return self.a + self.b # 用闭包实现 def add01(a): def add(b): return a+b return add if __name__ == '__main__': s = add01(2) print(s(1)) print(s(1))
python闭包的优点:
- 避免使用全局变量
- 可以提供部分数据的隐藏
- 可以提供更优雅的面向对象实现