Python迭代器_高级

点击查看代码
"""
案例:演示自定义迭代器

迭代器对象&可迭代对象定义:
    1、迭代器对象:实现了 __iter__() 和 __next__() 方法的对象,称为迭代器对象,该方法在每次调用时返回下一个值
    2、可迭代对象:实现了 __iter__() 或 __getitem__() 方法的对象,称为可迭代对象,该方法返回一个迭代器对象

迭代器对象&可迭代对象关键区别:
    1、功能差异:可迭代对象是数据的容器,迭代器是数据访问的工具
    2、状态保持:迭代器对象会记录当前迭代位置,可迭代对象本身不记录状态
    3、直接使用:可迭代对象不能直接调用 next(),迭代器对象可以

"""


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


class NumberCollection:
    """可迭代对象类 - 负责存储数据"""

    def __int__(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)

    def get_size(self):
        # 获取集合大小
        return len(self.numbers)

    def get_sum(self):
        # 计算集合元素之和
        return sum(self.numbers)

    def get_max(self):
        # 获取最大值
        return max(self.numbers)

    def get_min(self):
        # 获取最小值
        return min(self.numbers)


if __name__ == '__main__':
    # 创建可迭代对象
    collection = NumberCollection([1, 2, 3, 4, 5])

    print("=== 使用for循环迭代 ===")
    for num in collection:
        print(num)

    print("=== 使用手动迭代 ===")
    iterator1 = iter(collection)
    try:
        print(next(iterator1))
        print(next(iterator1))
        print(next(iterator1))
        print(next(iterator1))
        print(next(iterator1))
        print(next(iterator1))  # 抛出StopIteration
    except StopIteration as e:
        print("迭代已完成")

    print("\n=== 验证对象类型 ===")

    from collections.abc import Iterable, Iterator

    print(f"collection是可迭代对象: {isinstance(collection, Iterable)}")
    print(f"iterator1是迭代器: {isinstance(iterator1, Iterator)}")

    print("\n=== 测试集合操作 ===")
    collection.add_number(6)
    print(f"集合大小: {collection.get_size()}")
    print(f"元素之和: {collection.get_sum()}")
    print(f"最大值: {collection.get_max()}")
    print(f"最小值: {collection.get_min()}")

    print("\n=== 多个独立迭代器测试 ===")
    iterator2 = iter(collection)
    iterator3 = iter(collection)
    print(f"iterator2第一个元素: {next(iterator2)}")
    print(f"iterator3第一个元素: {next(iterator3)}")
    print(f"iterator2第二个元素: {next(iterator2)}")
    print(f"iterator3第二个元素: {next(iterator3)}")

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