Python迭代器_迭代器对象可迭代对象必须分开场景

点击查看代码
"""
案例:展示了迭代器对象和可迭代对象必须分开实现的场景:

- **核心需求**:多个迭代器需要同时独立遍历同一个数据集
- **问题所在**:单一类实现时,所有迭代器共享同一个状态变量,导致进度冲突
- **解决方案**:`NumberCollection`作为可迭代对象负责数据存储,每次调用`__iter__()`都返回新的`NumberIterator`实例
- **实际应用**:在多线程环境、复杂数据处理、需要保存多个迭代快照等场景下,这种分离设计是必要的

    通过这种分离设计,每个迭代器都能维护自己的进度状态,实现了真正的独立迭代能力
"""


class NumberIterator:
    """迭代器类 - 每个实例维护独立的迭代状态"""

    def __init__(self, numbers):
        self.numbers = numbers
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.numbers):
            raise StopIteration
        value = self.numbers[self.index]
        self.index += 1
        return value


class NumberCollection:
    """可迭代对象类 - 数据存储,不维护迭代状态"""

    def __init__(self, numbers=None):
        self.numbers = numbers if numbers is not None else []

    def __iter__(self):
        # 每次调用都返回新的迭代器实例
        return NumberIterator(self.numbers)

    def add_number(self, number):
        self.numbers.append(number)


# 使用场景演示
if __name__ == "__main__":
    collection = NumberCollection([1, 2, 3, 4, 5])

    print("=== 多个独立迭代器同时工作 ===")

    # 创建两个独立的迭代器
    iterator1 = iter(collection)
    iterator2 = iter(collection)

    # 两个迭代器独立工作,互不干扰
    print(f"迭代器1: {next(iterator1)}")  # 1
    print(f"迭代器2: {next(iterator2)}")  # 1
    print(f"迭代器1: {next(iterator1)}")  # 2
    print(f"迭代器2: {next(iterator2)}")  # 2

    # 添加新元素后,现有迭代器不受影响
    collection.add_number(6)

    print(f"迭代器1: {next(iterator1)}")  # 3
    print(f"迭代器2: {next(iterator2)}")  # 3

    print("\n=== 与单一类实现的对比 ===")


    # 如果使用同一个类实现,会出现状态冲突
    class BadDesign:
        def __init__(self, numbers):
            self.numbers = numbers
            self.index = 0

        def __iter__(self):
            return self

        def __next__(self):
            if self.index >= len(self.numbers):
                raise StopIteration
            value = self.numbers[self.index]
            self.index += 1
            return value


    bad = BadDesign([1, 2, 3, 4, 5])
    bad_iter1 = iter(bad)
    bad_iter2 = iter(bad)  # 实际上返回的是同一个对象

    print(f"坏设计的迭代器1: {next(bad_iter1)}")  # 1
    print(f"坏设计的迭代器2: {next(bad_iter2)}")  # 2 - 状态被共享了!

posted @ 2025-11-13 18:42  小熊熊8910  阅读(5)  评论(0)    收藏  举报