12、装饰器模板、yied与return的异同
1、装饰器模板
def deco1(func1): # func1=被装饰的index的内存地址
def wrapper1(args, kwargs):
print('**1')
res1 = func1(args, **kwargs)
print('end1')
return res1
return wrapper1
def deco2(func2): # func2=被装饰的index的内存地址
def wrapper2(*args, **kwargs):
print('******2')
res2 = func2(*args, **kwargs)
print('end2')
return res2
return wrapper2
def deco3(func3): # func3=被装饰的index的内存地址
def wrapper3(*args, **kwargs):
print('******3')
res3 = func3(*args, **kwargs)
print('end3')
return res3
return wrapper3
# index=wrapper1的内存地址
@deco1 # deco1(wrapper2的内存地址)-->wrapper1的内存地址
@deco2 # deco2(wrapper3的内存地址)-->wrapper2的内存地址
@deco3 # deco3(被装饰的index的内存地址)-->wrapper3的内存地址
def index():
print('index...')
index()
2、yied与return的异同
相同点:返回值层面的用法都一样
不同点:return只能返回一次,而yield可以返回多次
生成器:
def func():
print('xxx')
yield
print('yyy')
yield
print('zzz')
yield
当函数内出现yield关键字,再调用函数并不会触发函数体代码的运行,会返回一个生成器
生成器就是一种自定义的迭代器
g = func()
res = next(g)
案例:造迭代器
def func()
res=1
while True:
yield res
res +=1
g=func()