1 import time 2 def consumer(name): 3 print('%s准备吃包子了!' %name) 4 while True: 5 baozi = yield 6 print('[%s]包子来了,被[%s]吃了' %(baozi,name)) 7 8 def producer(name): 9 c = consumer('胖虎') 10 c2 = consumer('狗子') 11 c.__next__() 12 c2.__next__() 13 print('我要做包子啦!狗子,胖虎') 14 for i in a: 15 time.sleep(1) 16 print('%s做了2个包子'%name) 17 c.send(i) 18 c2.send(i) 19 a = ['韭菜馅','猪肉馅', '鸡蛋馅','茴香馅'] 20 producer('Lee')
1、生成器中,next 和 send 有什么区别呢?
next只是单纯的调用yeild,程序跳转到yeild,但是不会给yeild传值。
send也是调用yeild,但是同时给yeild传值
2、那么看程序第11、12行,问题来了,此处为什么必须要执行next?
过程分析:
消费者 '胖虎' 执行完之后执行一个next,如果不执行这个next,那么
consumer(name)中什么动作都没有执行,只有使用next这个指令,才可以使程序执行到 baozi = yield 这个语句,
这样才可以执行第三行语句,也就是打印第3行中print中的内容
原理分析:
c = consumer('胖虎') 这条语句只是将函数consumer(name)这个函数变成了一个生成器,而并不执行consumer(name)的内容,
因为此时consumer(name)不是函数,而是一个生成器
所以要想执行consumer(name)中的内容,只有使用next,才可以让程序在consumer(name)中往下走