定义生成器的两种方式
(a for a in range(50)): 用小括号替代列表生成式中的[]
利用关键字yeild
生成器的特点
生成器可以用【next()】或者【生成器. _ next _ ()】进行调用
调用生成器时候,不执行任何语句,只生成一个生成器,如下代码所示:
import time
def consume(name):
print("%s 准备吃包子了!" %name)
while True:
baozi = yield
print("包子[%s]来啦,被[%s]吃了"%(baozi, name))
c = consume('yl')
#<generator object consume at 0x00000000058F19D8>
- 调用第一个next方法的时候,会进入生成器,但遇到yeild字段就会跳出函数,并记录当前位置并退出返回函数调用位置,当下一次调用next方法或者send这样的函数,会再次计入函数体并从上次记录的位置继续执行下去。如下代码所示:
# -*- coding: utf-8 -*-
import time
def consume(name):
print("%s 准备吃包子了!" %name)
while True:
baozi = yield
print("包子[%s]来啦,被[%s]吃了"%(baozi, name))
c = consume('yl')
next(c)
#输出:
#yl 准备吃包子了!
-------------------------------------------------------
# -*- coding: utf-8 -*-
import time
def consume(name):
print("%s 准备吃包子了!" %name)
while True:
baozi = yield
print("包子[%s]来啦,被[%s]吃了"%(baozi, name))
c = consume('yl')
next(c)
next(c)
#输出:
#yl 准备吃包子了!
#包子[None]来啦,被[yl]吃了
- 利用生成器实现的生产者消费者模型
# -*- coding: utf-8 -*-
import time
def consume(name):
print("%s 准备吃包子了!" %name)
while True:
baozi = yield
print("包子[%s]来啦,被[%s]吃了"%(baozi, name))
def producer(name):
c = consume('A')
c2 = consume('B')
next(c)
next(c2)
print("开始做包子了!")
for i in range(10):
time.sleep(1)
print("做了1个包子,分两半")
c.send(i)
c2.send(i)
producer("yl")
# 输出
# A 准备吃包子了!
# B 准备吃包子了!
# 开始做包子了!
# 做了1个包子,分两半
# 包子[0]来啦,被[A]吃了
# 包子[0]来啦,被[B]吃了
# 做了1个包子,分两半
# 包子[1]来啦,被[A]吃了
# 包子[1]来啦,被[B]吃了
# 做了1个包子,分两半
# 包子[2]来啦,被[A]吃了
# 包子[2]来啦,被[B]吃了
# 做了1个包子,分两半
# 包子[3]来啦,被[A]吃了
# 包子[3]来啦,被[B]吃了
# 做了1个包子,分两半
# 包子[4]来啦,被[A]吃了
# 包子[4]来啦,被[B]吃了
# 做了1个包子,分两半
# 包子[5]来啦,被[A]吃了
# 包子[5]来啦,被[B]吃了
# 做了1个包子,分两半
# 包子[6]来啦,被[A]吃了
# 包子[6]来啦,被[B]吃了
# 做了1个包子,分两半
# 包子[7]来啦,被[A]吃了
# 包子[7]来啦,被[B]吃了
# 做了1个包子,分两半
# 包子[8]来啦,被[A]吃了
# 包子[8]来啦,被[B]吃了
# 做了1个包子,分两半
# 包子[9]来啦,被[A]吃了
# 包子[9]来啦,被[B]吃了