约 1914 字

约 10 分钟

#Python 的迭代器和可迭代对象

#迭代器

迭代器(Iterator) 是 Python 中用于遍历集合对象的工具,它提供了一种统一的访问集合元素的方式。

在 Python 中,对象只要包含 __next__ 方法就被视为迭代器,该函数每次被调用时返回下一项数据,没有下一项时产生 StopIteration 异常。

通过 next 函数来获取迭代器的下一个数据项。

示例:

import io

# 迭代器类
class Iterator:
    def __init__(self, stop):
        self.__stop = stop
        self.__current = 0
    
    # 逐项返回数据
    def __next__(self):
        if self.__current < self.__stop:
            self.__current += 1
            return self.__current - 1
        else:
            raise StopIteration

# 迭代器对象
iterator = Iterator(10)

# 迭代
while (value := next(iterator, None)) is not None:
    print(value)

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

#可迭代对象

可迭代对象(Iterable) 是拥有迭代器的对象,在 Python 中,对象只要包含 __iter__ 方法就被视为可迭代对象,该函数负责返回迭代器。

通过 iter 函数来获取可迭代对象的迭代器。

示例:

# 迭代器类
class Iterator:
    def __init__(self, stop):
        self.__stop = stop
        self.__current = 0
    
    # 逐项返回数据
    def __next__(self):
        if self.__current < self.__stop:
            self.__current += 1
            return self.__current - 1
        else:
            raise StopIteration

# 可迭代对象类
class Iterable:
    def __init__(self, stop):
        self.__iterator = Iterator(stop)

    def __iter__(self):
        return self.__iterator

# 创建可迭代对象
iterable = Iterable(10)

# for 迭代
for value in iterable:
    print(value)

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

将迭代器和可迭代对象写作两个类并不是必须的,很多时候可迭代对象的迭代器就是自己本身,__iter__ 函数返回 self。

例如:

# 既是可迭代对象又是迭代器
class Iterator:
    def __init__(self, stop):
        self.__stop = stop
        self.__current = 0
    
    # 
    def __next__(self):
        if self.__current < self.__stop:
            self.__current += 1
            return self.__current - 1
        else:
            raise StopIteration

    # 返回自身
    def __iter__(self):
        self.__current = 0 # 初始化
        return self

# 创建迭代器
iterator = Iterator(10)

# for 迭代
for value in iterator:
    print(value)

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

更新: 2025/5/23

作者: PlanC

创建: 2025/5/23