Python_生成器generator
生成器:调用时返回一个迭代器
如果一个函数中包含yield语法,那这个函数就会变成一个生成器
例1:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def draw_money(draw): #这个函数称为生成器 2 while draw >0: 3 draw -=100 4 yield 100 #100 是返回的值 5 print('取钱!') 6 atm = draw_money(300) 7 print(type(atm)) 8 print(atm.__next__()) 9 print(atm.__next__()) 10 print('干了一件其他的事') #代码执行中断也不影响下一次的继续执行 11 print(atm.__next__()) 12 # print(atm.__next__()) #代码已经执行完了,添加这行会报错
结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 100 2 取钱! 3 100 4 干了一件其他的事 5 取钱! 6 100
例2:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time def customer(name): print('我( %s )来吃冰淇淋啦'% name) while True: ice_cream = yield print('我是 ( %s ) ,我吃了冰淇淋( %s )' % (name, ice_cream)) def producer(name): ice_1 = customer('Vera') ice_2 = customer('Presly') ice_1.__next__() ice_2.__next__() print('我( %s )来做冰淇淋了!'% name) for i in range(5): time.sleep(2) print('我把这个冰淇淋叫做冰淇淋( %s )!!!'% i) ice_1.send(i) ice_2.send(i) producer('balala')
结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
我( Vera )来吃冰淇淋啦 我( Presly )来吃冰淇淋啦 我( balala )来做冰淇淋了! 我把这个冰淇淋叫做冰淇淋( 0 )!!! 我是 ( Vera ) ,我吃了冰淇淋( 0 ) 我是 ( Presly ) ,我吃了冰淇淋( 0 ) 我把这个冰淇淋叫做冰淇淋( 1 )!!! 我是 ( Vera ) ,我吃了冰淇淋( 1 ) 我是 ( Presly ) ,我吃了冰淇淋( 1 ) 我把这个冰淇淋叫做冰淇淋( 2 )!!! 我是 ( Vera ) ,我吃了冰淇淋( 2 ) 我是 ( Presly ) ,我吃了冰淇淋( 2 ) 我把这个冰淇淋叫做冰淇淋( 3 )!!! 我是 ( Vera ) ,我吃了冰淇淋( 3 ) 我是 ( Presly ) ,我吃了冰淇淋( 3 ) 我把这个冰淇淋叫做冰淇淋( 4 )!!! 我是 ( Vera ) ,我吃了冰淇淋( 4 ) 我是 ( Presly ) ,我吃了冰淇淋( 4 )