php中文网

为何去掉打印迭代器列表才能执行后续代码?

php中文网

难以理解的代码执行行为:为何去掉打印迭代器列表才能执行后续代码

在代码中,函数y创建了一个生成器,该生成器以列表t中的元素作为其yield值,而函数exec依次打印迭代器g的列表表示以及其每个元素。

但当代码中打印g的列表表示时,就会引发一个奇怪的行为:for i in g循环无法执行。这是因为list(g)在生成器g上进行了一次完整迭代,消耗了所有元素。

因此,当后续的for i in g循环尝试遍历g时,由于迭代器已被耗尽,导致没有元素可供遍历。在这种情况下,for循环将不会执行。

为了解决此问题,可以避免在代码中使用list(g),因为它会消耗迭代器。相反,可以采用更显式的迭代方式,例如使用iter函数或next函数。例如:

def exec(g):
    # 逐个迭代 g 而不消耗它
    for i in iter(g):
        print(i)

或者,使用next函数:

def exec(g):
    while True:
        try:
            i = next(g)
            print(i)
        except StopIteration:
            break

以上就是为何去掉打印迭代器列表才能执行后续代码?的详细内容,更多请关注php中文网其它相关文章!