1、生成器含义
生成器函数是一种引用yield关键字的特殊函数,yield关键字实现的是“断点效果”,使函数暂定并挂起,待下一次迭代时继续执行。
调用生成器函数时,不会立刻执行函数体,而是返回生成器对象。当对象通过生成器启动函数(例如send函数和next函数)时,才能够实现迭代效果。Yield关键字现的是断点效果)。生成器函数格式为:
# yield 生成器
def func1():
print("port1")
yield 1
print("port2")
yield 2
f1 = func1()
f1.__next__()
2、启动函数
启动函数主要有__next__函数和send函数,通过启动函数执行迭代器函数,并依次返回迭代值。
1)next函数
使用next函数会执行生成器函数内容,遇到yield关键字则暂停,待下次迭代时继续执行。例如:
# yield 生成器,目前生成器并没有迭代值可返回
def func1():
print("port1")
yield
print("port2")
yield
f1 = func1()
print("执行第一部分")
f1.__next__()
print("执行第二部分")
f1.__next__()
# 运行结果
# 执行第一部分
# port1
# 执行第二部分
# port2
2)Send函数
Send函数对于next函数,其优点在于能够传递参数。例如:
def fund3():
num = 0
num1 = yield num
print(num)
print("send传进来的值:",num1)
num1 = yield num1 + 10
f3 = fund3()
f3_1 = f3.send(None) #首次使用send,需要传递None
print("第一个迭代值:",f3_1)
f3_2 = f3.send(1)
print("第二个迭代值:",f3_2)
# 运行结果
# 第一个迭代值: 0
# 0
# send传进来的值: 1
# 第二个迭代值: 11
3、生成器案例
import time
# 生产者与消费者案例
def product(c):
# 消费者的生成器启动
c.send(None)
i = 1
while i < 5:
print("生产的第{}个包子".format(i))
c.send(str(i))
time.sleep(2)
i = i + 1
print("product_end")
def customer():
while True:
n = yield
#print(n)
if not n:
print("customer_end")
return
print("消费的第{}个包子".format(n))
c = customer()
product(c)
# 运行结果
# 生产的第1个包子
# 消费的第1个包子
# 生产的第2个包子
# 消费的第2个包子
# 生产的第3个包子
# 消费的第3个包子
# 生产的第4个包子
# 消费的第4个包子
# product_end