生成器卡在列表理解中的无限循环中?

时间:2013-02-08 03:30:07

标签: python generator list-comprehension

这很好用:

>>> def my_range(stop):
    i = 0
    while i < stop:
        yield i
        i += 1

>>> [k for k in my_range(10) if k < 5]
[0, 1, 2, 3, 4]

现在我修改我的发电机:

>>> def my_range():
    i = 0
    while True:
        yield i
        i += 1

>>> result = []
>>> for k in my_range():
    if k < 5:
        result.append(k)
    else:
        break


>>> print(result)
[0, 1, 2, 3, 4]

现在,为什么这会陷入无限循环?即使我有k&lt; 5.只有当下一个被调用时,才应该迭代生成器吗?

>>> [k for k in my_range() if k < 5]

2 个答案:

答案 0 :(得分:7)

当LC返回false时,LC中的条件并不意味着break;如果您想要这种行为,请查看itertools,特别是takewhile()

答案 1 :(得分:6)

This answer解释得很好:

  

请记住以下内容:

[ expression for item in list if conditional ]
     

相当于:

for item in list:
    if conditional:
        expression

表示你的列表理解:

[k for k in my_range() if k < 5]

相当于:

for k in my_range():
    if k < 5:
        k

现在应该清楚为什么这永远不会终止:实际上break无限循环没有任何东西。