You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:46:23