如何实现可复用的无限数值序列?解决itertools.count不可复用问题
实现可复用的无限数值序列的方案
当然有办法实现可复用的无限数值序列啦!因为itertools.count是一次性的迭代器,遍历过一次后就会保留当前位置;而range之所以能复用,是因为它每次迭代都会生成一个新的遍历器。我们只需要让“无限序列”每次被迭代时都返回一个新的count实例,就能实现复用效果。
方案1:用工厂函数快速实现
最简单的方式是写一个工厂函数,每次调用它都会返回一个全新的count迭代器:
from itertools import count def reusable_count(start=0, step=1): return count(start, step) # 第一次遍历,输出 0 1 2 3 for i in reusable_count(): print(i) if i >= 3: break # 第二次遍历,重新从0开始输出 0 1 2 3 for i in reusable_count(): print(i) if i >= 3: break
每次调用reusable_count()都会得到一个新的迭代器,自然就能从头开始计数了。
方案2:自定义类模拟range的使用体验
如果你想要更接近range的用法(比如创建一个实例后反复使用),可以自定义一个类,实现Python的可迭代协议:
from itertools import count class ReusableInfiniteRange: def __init__(self, start=0, step=1): self.start = start self.step = step def __iter__(self): # 每次迭代都返回一个新的count迭代器 return count(self.start, self.step) # 创建可复用的无限序列实例 inf_seq = ReusableInfiniteRange() # 第一次遍历,输出 0 1 2 3 for i in inf_seq: print(i) if i >= 3: break # 第二次遍历,依然从0开始输出 0 1 2 3 for i in inf_seq: print(i) if i >= 3: break
这个类的实例和range一样,每次用for循环迭代时,都会触发__iter__方法,返回一个新的count迭代器,完美实现了“可复用的无限序列”效果。
为什么这两种方案有效?
核心逻辑是:迭代器是一次性的,但可迭代对象可以生成多个迭代器。range本身是一个可迭代对象,每次迭代都会生成一个新的遍历器;而count本身就是迭代器,所以只能用一次。我们的方案就是把count包装成可迭代对象,让每次迭代都生成新的count实例,从而实现复用。
内容的提问来源于stack exchange,提问作者drhagen
相关产品推荐
相关产品推荐

