繁体   English   中英

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

[英]Generator stuck in an infinite loop inside a 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 <5。生成器是否应该仅在调用next时才进行迭代?

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

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

这个答案很好地说明了这一点:

请记住以下几点:

 [ 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无限循环的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM