关于python:生成器陷入列表理解中的无限循环?

Generator stuck in an infinite loop inside a list comprehension?

这很好用:

1
2
3
4
5
6
7
8
>>> 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]

现在我修改生成器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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<5。生成器不应该只在调用next时迭代吗?

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


信用证中的条件并不意味着当它返回错误时出现break;如果您希望这种行为,那么请查看itertools,特别是takewhile()


这个答案很好地解释了这一点:

Keep in mind the following:

1
[ expression for item in list if conditional ]

Is equivalent to:

1
2
3
for item in list:
    if conditional:
        expression

这意味着你的清单理解:

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

相当于:

1
2
3
for k in my_range():
    if k < 5:
        k

现在应该清楚为什么这永远不会结束:实际上没有任何东西可以用于break无限循环。