这很好用:
>>> 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&lt; 5.只有当下一个被调用时,才应该迭代生成器吗?
>>> [k for k in my_range() if k < 5]
答案 0 :(得分:7)
当LC返回false时,LC中的条件并不意味着break
;如果您想要这种行为,请查看itertools
,特别是takewhile()
。
答案 1 :(得分:6)
This answer解释得很好:
请记住以下内容:
[ 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
无限循环没有任何东西。