我有一个生成器函数,它接受迭代器对象并对每个项目执行一些逻辑。这将在更大的迭代列表上运行。然后产生结果返回到调用代码,因此它可以打破for
和while
循环
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
起)并返回提示。
我错过了什么?为什么我的迭代器在耗尽时会挂起?
答案 0 :(得分:3)
迭代器不是悬挂的,它是你的while
循环。由于condition
在9
结束,因此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,这就变成了一个无限循环。