Python自定义迭代器类如何在每次迭代开始时重置索引属性?
解决自定义迭代器无法重复迭代的问题
你的自定义迭代器只能迭代一次,核心原因是你将可迭代对象与迭代器的逻辑合并在了同一个类中,且未在新迭代开始时重置索引。Python内置可迭代对象(如list)每次for循环都会生成新的迭代器,因此能重复从头迭代。下面提供两种标准解决方案:
方案1:在__iter__方法中重置索引
直接修改__iter__方法,每次触发新迭代时将索引重置为0,同时修正原代码中__next__的终止条件(原逻辑会漏掉最后一个元素):
class MyIterator: def __init__(self, my_list: list): self.my_list = my_list self._iteration_index = 0 def __iter__(self): # 每次启动新迭代前重置索引 self._iteration_index = 0 return self def __next__(self): # 索引超出列表长度时终止迭代 if self._iteration_index >= len(self.my_list): raise StopIteration element = self.my_list[self._iteration_index] self._iteration_index += 1 return element
测试验证:
my_iter = MyIterator([1, 2, 3, 4, 5]) # 第一次迭代 for item in my_iter: print(item) # 输出1、2、3、4、5 # 第二次迭代 for item in my_iter: print(item) # 再次输出1、2、3、4、5
方案2:拆分可迭代对象与迭代器(符合Python设计规范)
Python的设计范式中,可迭代对象的__iter__方法应返回新的迭代器实例,而非自身。这样每次迭代都会创建独立的迭代器,各自维护索引状态:
# 可迭代对象类:负责存储数据,生成迭代器 class MyIterable: def __init__(self, my_list: list): self.my_list = my_list def __iter__(self): # 每次迭代返回全新的迭代器 return MyIterator(self.my_list) # 迭代器类:负责维护迭代状态 class MyIterator: def __init__(self, my_list: list): self.my_list = my_list self._iteration_index = 0 def __iter__(self): return self def __next__(self): if self._iteration_index >= len(self.my_list): raise StopIteration element = self.my_list[self._iteration_index] self._iteration_index += 1 return element
使用方式:
my_iterable = MyIterable([1, 2, 3, 4, 5]) # 第一次迭代 for item in my_iterable: print(item) # 输出1、2、3、4、5 # 第二次迭代 for item in my_iterable: print(item) # 再次输出1、2、3、4、5
原代码的额外问题说明
原__next__方法中的终止条件self._iteration_index >= len(self.my_list) - 1会导致最后一个元素无法返回(例如列表长度为5时,索引到3就抛出异常,漏掉索引4的元素),上述两种方案均已修正该问题。
内容的提问来源于stack exchange,提问作者revsuine
相关产品推荐
相关产品推荐

