迭代器耗尽后,迭代器执行挂起

时间:2017-09-26 13:12:46

标签: python loops iterator generator

我有一个生成器函数,它接受迭代器对象并对每个项目执行一些逻辑。这将在更大的迭代列表上运行。然后产生结果返回到调用代码,因此它可以打破forwhile循环

def func(it):
    item = next(it)
    item = item.execute()
    yield item

it = iter(range(1, 10))

condition = True
while condition:
    for item in func(it):
        condition = item
        print condition

在Python IDLE中执行此代码,打印以下内容并挂起:

1
2
3
4
5
6
7
8
9

我需要CTRL + C来打破循环。如果我使用常规的范围(10),那么循环以值0开始,它会立即中断(自condition=0起)并返回提示。

我错过了什么?为什么我的迭代器在耗尽时会挂起?

2 个答案:

答案 0 :(得分:3)

迭代器不是悬挂的,它是你的while循环。由于condition9结束,因此while循环变为while 9,永不退出。完全取出while循环。

for item in func(it):
    condition = item
    print condition

或者,如果你想在条件为假时停止,那么:

for item in func(it):
    condition = item
    print condition
    if not condition: break

答案 1 :(得分:0)

for循环没有挂起。外部while循环是。您已将其设置为永久运行,条件从1-9更改,然后保持为9.因此,代码执行到:

while 9

总是返回True,这就变成了一个无限循环。