在generator中,我们不但可以通过for
循环来迭代,还可以不断调用next()
函数获取由yield
语句返回的下一个值。
但是Python的yield
不但可以返回一个值,它还可以接收调用者发出的参数。
例子:
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' %n)
r = '200 OK'
def produce(c):
c.send(None) # 启动生成器
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' %n)
r = c.send(n) # 一旦n有值,则切换到consumer执行
print('[PRODUCER] Consumer return: %s'%r)
c.close() # 关闭生成器
c = consumer()
produce(c)
consumer()函数其实就是一个简单的生成器了,我们都知道生成器是需要next()来触发的,但是在这边我们不用next()了,我们用生成器的send()方法
next()跟send()不同的地方是,next()只能以None作为参数传递,而send()可以传递yield的值。
所以 n = yield r 可以理解为yield在发送n的同时也在接收r值,通过produce(c)调用后,一旦有n值,则切换到 consumer去执行。执行完了后生成器关闭。