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

Python 生成器卡在列表中的无限循环中?,python,generator,list-comprehension,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: yiel

这很好:

>>> 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]

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

很好地解释了这一点:

请记住以下几点:

[ expression for item in list if conditional ]
相当于:

for item in list:
    if conditional:
        expression
for k in my_range():
    if k < 5:
        k
这意味着您的列表理解:

[k for k in my_range() if k < 5]
相当于:

for item in list:
    if conditional:
        expression
for k in my_range():
    if k < 5:
        k
现在应该很清楚为什么这永远不会终止:实际上没有什么可以打破无限循环。

有没有办法打破并使列表停止从生成器获取值?最好不用itertools@Michael为什么不使用itertools?