python yield 用法

2016-07-13  本文已影响0人  小五_555

介绍一个我个人关于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了, 有点更像消费者了。

上一篇下一篇

猜你喜欢

热点阅读