yield详解
生成器generator
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
yeild能暂时的保留函数的运行位置,每次遍历的时候返回一个值
1 def fool(): 2 yield 1 3 yield 2 4 yield 3 5 yield 4 6 m=fool() #m为一个生成器,yeild可以暂时的保留函数执行上下文的位置, 7 print m 8 for each in m:#生成器每次迭代返回一个值 9 print each
yeild小应用,每次迭代返回一个文件的一行
1 def Xreadlines(filepath): #注意,返回生成器的函数中含有return后面不能跟值 2 seek = 0 3 while True: 4 with open(filepath,'r') as f: 5 f.seek(seek) 6 data = f.readline() 7 if data: 8 seek = f.tell() 9 yield data 10 else: 11 return 12 13 14 for i in Xreadlines(filepath): 15 print i
yeild 在串行的程序中,实现异步的效果,已生产者消费者模型为例子
1 def consumer(name): 2 print '开始准备吃包子了' 3 while True: 4 baozi=yeild 5 print '%吃了一个%s包子'%(name,baozi) 6 7 def producer(name): 8 A=consumer('zhangsan') 9 B=consumer('lisi') 10 A.next() #yeild返回生成器 11 B.next() 12 print '%s开始制作包子了'%(name) 13 for i in range(1,11): 14 A.send(i) 15 B.send(i) 16 producer('zhenxingmin') 17 18