python yield 用法

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容