生成器函数
- 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。
- 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
母鸡下蛋的传说:
def xiadan():
"""
迭代的方式
# 缺点1:占空间大
# 缺点2:效率低
:return:
"""
ret = []
for i in range(100):
ret.append("鸡蛋%s" %i)
return ret
print(xiadan())
def xiadan2():
"""
生成器函数
好处:延迟计算,一次返回一个结果
:return:
"""
for i in range(100):
yield "鸡蛋%s" %i
jim = xiadan2()
print("客人过来去鸡蛋:",jim.__next__())
生产者消费者模型
生产者和消费者独立存在,通过生成器实现
"""
python 是顺序执行,生成函数完成后再执行消费函数(传统实现方式)
"""
def producer():
ret = []
for i in range(100):
ret.append("包子%s" %i)
return ret
def consumer(res):
for index,baozi in enumerate(res):
print("第%s个人,吃了%s" %(index,baozi))
res = producer()
consumer(res)
生产者消费者模型
import time
def consumer(name):
print("我是%s,我要开始吃包子了" %name)
while True:
baozi = yield
time.sleep(1)
print("%s 很开心的把【%s】吃掉了" %(name,baozi))
def produver():
c1 = consumer("姜维")
c1.__next__()
for i in range(5):
time.sleep(1)
print("包子%s 做好了" % i)
c1.send("包子%s" %i)
produver()
运行结果如下:
我是姜维,我要开始吃包子了
包子0 做好了
姜维 很开心的把【包子0】吃掉了
包子1 做好了
姜维 很开心的把【包子1】吃掉了
包子2 做好了
姜维 很开心的把【包子2】吃掉了
包子3 做好了
姜维 很开心的把【包子3】吃掉了
包子4 做好了
姜维 很开心的把【包子4】吃掉了
包子5 做好了
姜维 很开心的把【包子5】吃掉了