关于python:迭代器耗尽后迭代器执行挂起

Iterator execution hangs after the iterator is exhausted

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

1
2
3
4
5
6
7
8
9
10
11
12
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
1
2
3
4
5
6
7
8
9

我需要ctrl+c来打破循环。如果我使用常规范围(10),那么循环从值0开始,它会立即中断(因为condition=0)并返回提示。

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


迭代器不是挂起的,它是你的while循环。由于condition9处结束,while循环成为while 9而不退出。完全去掉while循环。

1
2
3
for item in func(it):
    condition = item
    print condition

或者,如果要在条件为假时停止,则:

1
2
3
4
for item in func(it):
    condition = item
    print condition
    if not condition: break


for循环未挂起。外部while循环是。当条件从1-9变为9时,您已经将其设置为永久运行。因此,代码执行到:

1
while 9

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