介绍一个我个人关于python yield的一点小看法
python代码中, 凡是带yield关键字的都被视为一个generator。代码可以从yield中断, 同时也可以从yield处传入值进去, 这样就有一点消费者的概念了。
def avg():
total = 0
res = 0
nums = 0
try:
while True:
new_num = yield res
nums += 1
total += new_num
res = total / nums
except StopIteration:
print("avg stop....")
这段代码是计算平均值的, 怎么使用呢?
a = avg() # 计算平均值的consumer
next(a) # run to the yield
a.send(1) # return 1.0
a.send(2) # return 1.5
a.close()
是不是有点消费者的感觉了。a是消费者, 当需要计算的时候,a.send(value), 是不是很方便呢。
还有些小问题, 每一次我们想用这样的生成器的时候,都需要调用next(a)来启动,有点不方便,写个装饰器来修改一下。
from functools import wraps
def gen(func):
@wraps(func)
def wrapper(*argv, **kw):
print("**wrap a generator to next yield")
temp = func(*argv, **kw)
next(temp)
return temp
return wrapper
#########################
@gen
def avg():
......
这样, 不用再写next了, 有点更像消费者了。