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] |
信用证中的条件并不意味着当它返回错误时出现
这个答案很好地解释了这一点:
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 |
号
现在应该清楚为什么这永远不会结束:实际上没有任何东西可以用于