一、概念:生成器是特殊的迭代器,只要函数yield的函数就是生成器函数。
二、作用:可以控制一个函数的执行,让一个函数执行到yield后停止执行,并返回对应的数据;可以使用next和send函数来启动生成器,执行函数体。
三、执行过程:当第一次启动生成器函数执行时,会从函数体的开头开始执行;之后再启动时,就会从上次执行暂停的地方,也就是yield处接着执行。
1.使用next启动生成器
def create_num(all_num):
print("-------1-------")
a, b = 0, 1
current_num = 0
while current_num < all_num:
print("-------2-------")
yield a # 3.函数体执行到yield后会将a返回,并且停在此次执行,下次会从下一行代码继续执行
print("-------3--------")
a, b = b, a+b
current_num += 1
print("-------4--------")
if __name__ == "__main__":
obj = create_num(22) # 1.这里不会执行函数体,会创建一个生成器对象给obj
ret = next(obj) # 2.next会执行实参对应的函数体,如果上次已经执行到yield,则会从yield处继续执行
print(ret)
ret = next(obj)
print(ret)
2.使用send启动生成器
def create_num(all_num):
a, b = 0, 1
current_num = 0
while current_num < all_num:
res = yield a
print("res: ", res)
a, b = b, a+b
current_num += 1
if __name__ == "__main__":
obj = create_num(2)
ret = next(obj)
print(ret)
ret = obj.send("传递给yield左边对象的数据")
"""
1.send启动生成器时,可以传递数据,将数据传递给yield左边的res;
2.之后继续执行yield的下一行代码,最后yield返回a的值给ret
"""
print(ret)