如何实现可循环数字迭代器:调用.next()时从9自动回到0?
实现轻量级循环0-9的迭代器
这题太对我胃口了!完全懂你不想用itertools.cycle([0,1,...,9])的原因——每个迭代器都存一份完整的列表,当你要创建成百上千个实例时,内存浪费确实没必要。咱们自己写个极简的迭代器类就行,每个实例只维护一个当前状态的整数,用你说的模运算逻辑循环,内存开销几乎可以忽略。
核心实现代码
直接上最贴合你需求的版本,专门针对0-9循环:
class Cycle0To9: def __init__(self): # 初始设为9,这样第一次调用next()会返回0,符合直觉 self.current = 9 def __iter__(self): # 迭代器协议要求返回自身 return self def __next__(self): # 核心逻辑:加1后取模10,自动循环 self.current = (self.current + 1) % 10 return self.current
测试用法
你可以像这样调用它:
# 创建一个迭代器实例 counter = Cycle0To9() # 手动调用next()测试 print(next(counter)) # 输出 0 print(next(counter)) # 输出 1 # 连续调用到9之后 for _ in range(8): next(counter) print(next(counter)) # 输出 9 print(next(counter)) # 输出 0,完美循环回去了
为什么这个方案适合你?
- 内存友好:每个
Cycle0To9实例只保存一个整数(self.current),不管创建多少个,内存占用都微乎其微,完全不会出现重复列表占用内存的问题。 - 逻辑清晰:完全遵循你想要的
x + 1 % 10循环逻辑,没有多余的依赖。 - 符合迭代器协议:可以直接用在
for循环里,和Python原生迭代器用法一致:# 用在for循环中,循环输出5次 counter = Cycle0To9() for _ in range(5): print(next(counter)) # 0,1,2,3,4
扩展:通用循环范围迭代器
如果以后需要其他范围的循环(比如2-4,或者10-15),可以改成带参数的通用版本,逻辑同样简单:
class CyclicRangeIterator: def __init__(self, start=0, end=10): # end是开区间,比如end=10对应0-9,end=5对应start到4 self.start = start self.end = end # 初始值设为end-1,确保第一次next返回start self.current = end - 1 def __iter__(self): return self def __next__(self): self.current += 1 # 到达边界后跳回起点 if self.current >= self.end: self.current = self.start return self.current
用法示例:
# 循环2、3、4 counter = CyclicRangeIterator(start=2, end=5) print(next(counter)) # 2 print(next(counter)) # 3 print(next(counter)) # 4 print(next(counter)) # 2,循环生效
内容的提问来源于stack exchange,提问作者Tryer
相关产品推荐
相关产品推荐

