1、当python的函数中出现yield,那么该函数就不是一个普通函数,而是一个生成器generator。
2、生成器generator是一种迭代器iterator,像list、tuple一样是可迭代的。
3、第一次调用带yield 的generator function,必须先使用next()或send(None)
4、yield是一个类似return的关键字,迭代一次遇见yield就返回yield后面的值。下一次迭代时,从上一次遇见yield后面的代码开始执行。
5、yield不断可以返回一个值,还能调用接收者发送的参数。
下面以缪雪峰官网例子,修改后做测试:点击打开链接
def consumer():
r = 3
while True:
print(r)
n = yield (r+1)
if not n:
return
print('[CONSUMER] Consuming %s...' %(2*n))
r = 9
def produce(c):
m = c.send(None)
print(m)
print('hello')
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
c = consumer()
produce(c)
执行结果如下图所示:
理解:
1、执行
m = c.send(None)
进入consumer() --> print(r )--> 返回yield后面的r+1,赋值给m
2、在produce(c)的while循环中,例如第一个n=0
n = n + 1 --> print('[PRODUCER] Producing %s...' % n) --> r = c.send(n)
执行到r = c.send(n),n=1,直接进入到consumer()中的yield部分,将1传递给consumer()中的yield后面的(r+1),此时consumer()中的n=1。在consumer()中,执行print('[CONSUMER] Consuming %s...' %(2*n)), r = 9,while循环,print(r),直到下一个yield,并将yield后面的r+1返回给produce(c)中的r。
3、produce(c)中循环结束,结束consumer(),用c.close()。