1.引例
def producer(): r = [] for i in range(50): r.append('包子%s' % i) return r product= producer() def comsummer(product): for index, baozi in enumerate(product): print('第%s个人,吃了%s' % (index, baozi)) return 0 eat = comsummer(product)
上述代码有一个弊端就是,必须得等到生产者把所有的‘包子’都生产完,再交给消费者‘吃包子’。这样浪费了内存,消费者只能等待生产者。
2.send()函数的功能
send()函数有着与__next__()方法一样的功能,使生成器运行到第一个yield为止。send()的另一个功能是,能将括号内的值,传送到生成器运行中断的那个yield。也就是send()函数生成器运行到某一个yield中断,然后可以将值传给这个yield。
#.send()功能演示 def pro(): print('2018-19赛季最佳第一阵容') print('前锋NO.1') xiao_shuai = yield 'lebron james' print('前锋NO.2') print(xiao_shuai) yield 'pual george' pl = pro() print(pl.__next__()) re = pl.send('kevin durant') print(re) #运行结果: 2018-19赛季最佳第一阵容 前锋NO.1 lebron james 前锋NO.2 kevin durant pual george
3.生产者与消费者模型
当程序中出现明显的两类任务,一类任务是负责生产,另外一类任务是负责处理生产的数据的(如爬虫),我们就可以利用该模型来处理。
import time def consumer(name): print('我是%s,我要开始吃包子了' %name) while True: baozi = yield print('%s很开心地把%s吃掉了' %(name, baozi)) def producer(): c1 = consumer('lebron') c2 = consumer('durant') c1.__next__() c2.__next__() for i in range(5): c1.send('第%s个包子' %i) c2.send('第%s个饺子' %i) eat = producer() #运行结果: 我是lebron,我要开始吃包子了 我是durant,我要开始吃包子了 lebron很开心地把第0个包子吃掉了 durant很开心地把第0个饺子吃掉了 lebron很开心地把第1个包子吃掉了 durant很开心地把第1个饺子吃掉了 lebron很开心地把第2个包子吃掉了 durant很开心地把第2个饺子吃掉了 lebron很开心地把第3个包子吃掉了 durant很开心地把第3个饺子吃掉了 lebron很开心地把第4个包子吃掉了 durant很开心地把第4个饺子吃掉了
def action(name1, name2): print('%s 和 %s 开始1v1斗牛啦!' %(name1, name2)) time.sleep(1) while True: action1 = yield print('%s直接一个加速过掉%s,然后%s' %(name1, name2, action1)) time.sleep(1) action2 = yield print('%s背身单打%s,%s' %(name1, name2, action2)) yield '1v1结束' def move(): name1 = input('>>>') name2 = input('>>>') vs = action(name1, name2) vs.__next__() vs.send('一记战斧劈扣') end = vs.send('翻身跳投将球投进') print(end) p = move()