作用:不修改原来代码调用方式的情况下添加新功能
1、无参无返回值的被装饰函数
def funct(): time.sleep(1) print('test')def timer(f): #timer就是一个装饰器函数 def inner(): start = time.time() f() # 被装饰的函数 end=time.time() print(end-start) return innerfunct=timer(funct)funct()
2、无参有返回值的被装饰函数
def timer1(f): #装饰器函数 def inner(): start = time.time() res=f() # 被装饰的函数 end=time.time() print(end-start) return res return inner@timer1 def funct1(): # 被装饰函数 time.sleep(1) print('test') return 'Happy New Year'print(funct1())
3、有参有返回值的被装饰函数
4、多种参数的被装饰函数
装饰器进阶
1、获取被装饰函数信息
#from functools import wraps # 想要取得被装饰函数的信息可以引用改装饰器def wrapper(func): #@wraps(func) def inner(*args,**kwargs): print('执行前') ret = func(*args,**kwargs) print('执行后') return ret return inner@wrapperdef holiday(day): '''放假通知''' print('全体放假%d天'%day) return 'happy'print(holiday.__name__)print(holiday.__doc__)result= holiday(3)
2、启用和关闭装饰器
import time# FLAGE=TrueFLAGE=False# 最多包三层def timer_out(flag): def timer(func): def inner(*args,**kwargs): if flag: start=time.time() ret= func(*args,**kwargs) end=time.time() print(end-start) return ret else: ret=func(*args,**kwargs) return ret return inner return timer@timer_out(FLAGE) # @timer_out(FLAGE)=>@timer=>a=timer(a)def a(): time.sleep(0.1) print('a')@timer_out(FLAGE)def b(): time.sleep(0.1) print('b')a()b()
3、多个装饰器装饰同一个函数
def wrapper1(func): # func=>inner2 def inner1(): print('wrapper1,before func') func() print('wrapper1,after func') return inner1def wrapper2(func): # func=>f def inner2(): print('wrapper2,before func') func() print('wrapper2,after func') return inner2# 先从离被装饰函数近的装饰器开始执行# 当执行到@wrapper1找不到被装饰函数@wrapper1 # f=wrapper1(inner2)=inner1@wrapper2 # f=wrapper2(f)=inner2def f(): print('in f')f() # =>inner1()
解析:
其他
生成器
# 只要是含有yield 关键字的函数都是生成器函数# 只能在函数内使用 不能与return共用# 生成器函数执行之后会得到一个生成器作为返回值# 生成器是个迭代器# def generator(): # 生成器函数# print(1)# yield 'a'# ret = generator() # 生成器# print(ret.__next__())def generator(): print(1) yield 'a' print(2) yield 'b'ret = generator() # print(ret.__next__()) # 执行完就不在内存中了# print(ret.__next__())for i in ret: print(i)# 列表是可迭代的 不是迭代器 当用for遍历它时会生成一个迭代器