一 闭包函数
一、什么是闭包
二、闭包的意义与应用
二 装饰器
一、为何要用装饰器
二、什么是装饰器
三、装饰器的作用
四、装饰器的语法
五、装饰器补充:wraps
一、什么是闭包
1 #内部函数包含对外部作用域而非全局作用域的引用 2 3 #提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路 4 5 def counter(): 6 n=0 7 def incr(): 8 nonlocal n 9 x=n 10 n+=1 11 return x 12 return incr 13 14 c=counter() 15 print(c()) 16 print(c()) 17 print(c()) 18 print(c.__closure__[0].cell_contents) #查看闭包的元素
二、闭包的意义与应用
1 #闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域 2 #应用领域:延迟计算(原来我们是传参,现在我们是包起来) 3 from urllib.request import urlopen 4 5 def index(url): 6 def get(): 7 return urlopen(url).read() 8 return get 9 10 baidu=index('http://www.baidu.com') 11 print(baidu().decode('utf-8'))
二 装饰器(装饰器就是闭包函数的一种应用场景)
一、为何要用装饰器
#开放封闭原则:对修改封闭,对扩展开放
二、什么是装饰器
1 # 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。 2 # 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 3 # 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
三、装饰器的作用
1 import time 2 def timmer(func): 3 def wrapper(*args,**kwargs): 4 start_time=time.time() 5 res=func(*args,**kwargs) 6 stop_time=time.time() 7 print('run time is %s' %(stop_time-start_time)) 8 return res 9 return wrapper 10 11 @timmer 12 def foo(): 13 time.sleep(3) 14 print('from foo') 15 foo()