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

jur*_*eza 0 python list-comprehension generator

这很好用:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

现在我修改我的发电机:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

现在,为什么这个陷入无限循环?即使我有k <5.生成器是否应该只在下一次被调用时迭代?

>>> [k for k in my_range() if k < 5]
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 7

LC中的条件并不意味着它break何时返回false; 如果你想要那种行为,那么请itertools特别注意takewhile().


Mat*_*all 6

这个答案解释得很好:

请记住以下内容:

[ expression for item in list if conditional ]
Run Code Online (Sandbox Code Playgroud)

相当于:

for item in list:
    if conditional:
        expression
Run Code Online (Sandbox Code Playgroud)

这意味着你的列表理解:

[k for k in my_range() if k < 5]
Run Code Online (Sandbox Code Playgroud)

相当于:

for k in my_range():
    if k < 5:
        k
Run Code Online (Sandbox Code Playgroud)

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