0

这工作正常:

>>> 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 < 5。生成器不应该只在调用 next 时迭代吗?

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

2 回答 2

7

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

于 2013-02-08T03:33:47.510 回答
6

这个答案很好地解释了它:

请记住以下几点:

[ 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无限循环没有任何意义。

于 2013-02-08T03:39:38.150 回答