生成器函数:包含yield语句的函数;
生成器对象:生成器对象和迭代器对象行为相似,都支持可迭代接口:__next__(),若想执行生成器函数内部语句,则需要迭代协议’
A、生成器函数被调用时,并不会执行函数内部语句,而是返回一个生成器对象;
B、每执行一条语句,返回对应的一个yield数值,虽然函数被yield临时返回了数值,但保留了程序运行的状态,即在此执行g.__next__()时,则继续执行函数语句,并返回第二个yield对应的数值;当执行完所有的yield返回值后,程序抛出停止迭代异常:StopIterstion;这种行为和迭代器一样,实现了迭代器的接口。
def f(): print('in f(), 1') yield 1 print('in f(), 2') yield 2 print('in f(), 3') yield 3 g = f() print(g) # 输出:<generator object f at 0x056F8210>,是一个生成器对象; print(g.__next__()) # 输出:in f(), 1 1 print(g.__next__()) # 输出:in f(), 2 2 print(g.__next__()) # 输出:in f(), 3 3 print(g.__next__()) # 输出:StopIteration
C、生成器对象也是一个可迭代的对象,即它可以放在for循环中in的后面,则说明生成器对象实现了__iter__()方法,返回了其自身;
for x in g: print(x)
#输出:in f(), 1 1 in f(), 2 2 in f(), 3 3
D、生成器对象即实现了迭代器接口(__next__()),又实现了可迭代接口(__iter__()),返回其自身;
print(g.__iter__() is g)
# 输出 True