这里有multiple questions询问所有推荐range
的无限itertools.count
。但是,range
有count
没有的能力 - 它可以重复使用。
a = range(100)
# Prints 0 1 2 3
for i in a:
print(i)
if i >= 3:
break
# Prints 0 1 2 3
for i in a:
print(i)
if i >= 3:
break
from itertools import count
b = count(0)
# Prints 0 1 2 3
for i in b:
print(i)
if i >= 3:
break
# Prints 4, does not use a fresh count(0)
for i in b:
print(i)
if i >= 3:
break
有没有办法重用itertools.count
或以其他方式获得可重用/重启无限可迭代?
答案 0 :(得分:2)
根本问题是range
是Iterable
而count
是Iterator
。 Iterator
是具有__next__
方法的对象,只能执行一次,而Iterable
具有__iter__
方法,可以多次调用以返回每次都要新鲜Iterator
。
一种解决方案是简单地创建自己的Iterable
版count
,只要调用itertools.count
方法,就会返回__iter__
。
from itertools import count
class Count:
def __init__(self, start=0):
self.start = start
def __iter__(self):
return count(self.start)