1.yield: (1) yield 3 相当于return,控制的是函数的返回值
(2)x = yield 的另一个特性,接受send传过来的值赋值给x
举例说明
def test(): print('开始了') first = yield yield没有返回值,因此运行结果为None print('第二次调用',first) yield 2 yield3 t = test() res = t.__next__() print(res) res = t.send('函数停留在first那个位置,我就是给first赋值的') print(res) 运行结果: 开始了 None 第二次调用 函数停留在first那个位置,我就是给first赋值的 2
send()函数的作用是进行下一次迭代(触发迭代器运行),并传入一个值,赋值给yield,此yield为函数停留处的yield,如果不传入一个值会报错
总结:触发迭代器运行的方法至此有三种 t = test()
(1)print(t.__next__)
(2)print(next(t))
(3)print(t.send(x))
生产者消费者模型: 实现了从A程序跳到B程序,通过while循环语句、yield 以及 send函数实现
import time def consumer(name): print('我是[%s],我开始吃包子了'%name) while True: baozi = yield time.sleep(1) print('%s很开心的把[%s]吃掉了'%(name,baozi)) def producer(): c1 = consumer('wupeiqi') 调用程序后运行到这一步,c1、c2可以理解为变为迭代器(调用了迭代器函数),(并不会运行函数内的语句) c2 = consumer('yuanhao') c1.__next__() 此时c1、c2触发迭代(),开始运行函数内的语句,即print(‘我是[%s],我开始吃包子了’%name),然后进入while循环到 yield停止 c2.__next__() for i in range(10): time.sleep(1) c1.send('包子 %s' %i) 此时调用send函数,给yield传入一个值,同时通过baozi = yield将值传给了baozi,并触发迭代,执行第二个print, c2.send('包子 %s' %i) 此时仍在while死循环中,到yield停止, 程序运行到最后,其实是停在了yield处 producer() 运行结果: 我是[wupeiqi],我开始吃包子了 我是[yuanhao],我开始吃包子了 wupeiqi很开心的把[包子 0]吃掉了 yuanhao很开心的把[包子 0]吃掉了 wupeiqi很开心的把[包子 1]吃掉了 yuanhao很开心的把[包子 1]吃掉了 wupeiqi很开心的把[包子 2]吃掉了 yuanhao很开心的把[包子 2]吃掉了 wupeiqi很开心的把[包子 3]吃掉了 yuanhao很开心的把[包子 3]吃掉了 wupeiqi很开心的把[包子 4]吃掉了 yuanhao很开心的把[包子 4]吃掉了 wupeiqi很开心的把[包子 5]吃掉了 yuanhao很开心的把[包子 5]吃掉了 wupeiqi很开心的把[包子 6]吃掉了 yuanhao很开心的把[包子 6]吃掉了 wupeiqi很开心的把[包子 7]吃掉了 yuanhao很开心的把[包子 7]吃掉了 wupeiqi很开心的把[包子 8]吃掉了 yuanhao很开心的把[包子 8]吃掉了 wupeiqi很开心的把[包子 9]吃掉了 yuanhao很开心的把[包子 9]吃掉了