生成器

生成器(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

参考文章

《Python3 迭代器与生成器》
《如何理解Python中的可迭代对象、迭代器和生成器》

posted @ 2020-05-03 17:11  cnhkzyy  阅读(161)  评论(0编辑  收藏  举报