生成器函数进阶day14
def generator():
print(123)
yield 1
print(456)
yield 2
print(789)
g = generator()
ret = g.__next__()
print('***',ret) # 123 ,*** 1
ret = g.__next__()
print('***',ret) # 456 ,*** 2
ret = g.__next__() #会报错,因为之后没有yield了
生成器另一种方法:
send获取下一个值的效果和next基本一致,只是在获取下一个值的时候,给上一个yield的位置传递一个数据
使用send的注意事项:
第一次使用生成器的时候,使用next获取下一个值
最后一个yield不能接收外部的值
def generator():
print(123)
content = yield 1
print('=======',content)
print(456)
yield 2
g = generator()
ret = g.__next__()
print('***',ret)
ret = g.send('hello') # send的效果和next一样
print('***',ret)
============================================================================
获取移动平均值
def average():
sum = 0
count =0
avg = 0
while True:
num = yield avg
sum += sum
count += 1
avg = sum / count
avg_g = average()
avg_g.__next__() #第一次使用生成器的时候,使用next获取下一个值
avg1 = avg_g.send(10)
print(avg1)
avg = sum / count
============================================================================
生成器的装饰器
def init(func):
def inner(*args,**kwargs):
g = func(*args,**kwargs)
g.__next__()
return g
return inner
@init
def average():
sum = 0
count =0
avg = 0
while True:
num = yield avg
sum += sum
count += 1
avg = sum / count
avg_g = average()
ret = avg_g.send(10)
print(ret)