python 协程

2019-08-24  本文已影响0人  落羽归尘

python 协程

生成器转协程

先看下面例子,我们根据此例子分析:

>>> def test():
...     print("start")
...     x = yield
...     print("x: %s" % x)
...     y = yield x
...     print("end")
...     print("y: %s" % y)
...
>>> g=test()
>>> next(g)
start
>>> g.send(3)
x: 3
3
>>> g.send(6)
end
y: 6
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

我们用一个例子通过协程的方式求移动平均值:

def averager():
    total = 0.0
    count = 0
    average = None
    while True:
        term = yield average 
        total += term
        count += 1
        average = total/count

ave=averager()
next(ave)
print(ave.send(2))
print(ave.send(3))
print(ave.send(4))
print(ave.send(5))
输出结果:
2.0
2.5
3.0
3.5

可以调用ave.close()方法终止协程。

yield from

yield from 简化了for循环的yield表达式:

def gen():
    for i in range(3):
        yield i

# 等同于

def gen_new():
    yield from range(3)

print(list(gen()), list(gen_new()))
输出结果:
[0, 1, 2] [0, 1, 2]

gen等同于gen_new。yield from后面跟可迭代对象x。因为yield from x会调用iter(x)。

上一篇 下一篇

猜你喜欢

热点阅读