生成器(generator)
使用了yield关键字的函数称为生成器。在调用生成器的过程中,每次遇到yield,函数会暂停并保存当前所有的运行信息,返回yield的值,并在下次执行next()方法时,继续从当前位置运行
调用一个生成器函数,返回的是一个生成器对象(迭代器对象)。生成器本身也是迭代器
例子
def gen_AB():
print("start")
yield "A"
print("continue")
yield "B"
print("end")
res1 = [x * 3 for x in gen_AB()]
print(res1)
for i in res1:
print("--->", i)
print("=============")
res_2 = (x * 3 for x in gen_AB())
print(res_2)
#
for i in res_2:
print("--->", i)
# 运行结果
start
continue
end
['AAA', 'BBB']
---> AAA
---> BBB
=============
<generator object <genexpr> at 0x0000000001DF29A8>
start
---> AAA
continue
---> BBB
end
在上述例子中,方法gen_AB的调用gen_AB()是一个迭代器。res1是通过列表生成式生成的列表,因此先执行gen_AB(),再遍历新的列表对象。而res2是一个新的迭代器,因此在使用for循环遍历迭代器对象的时候,第一次先执行start ---> AAA,接着执行continue ---> BBB,最后执行end
由于迭代器可以使用next()获取元素,因此也可以使用next和异常捕获
it = gen_AB()
while True:
try:
print(next(it))
except StopIteration:
pass