什么让Python中的对象可迭代

51 投票
4 回答
39220 浏览
提问于 2025-04-16 13:26

在Python中,什么东西是可迭代的?也就是说,能不能用for循环来遍历它?

我可以在Python中创建一个可迭代的类吗?如果可以的话,应该怎么做?

4 个回答

5

任何有 __iter__() 方法的对象都被认为是可迭代的。

另外,任何序列(也就是那些有 __getitem__() 方法的对象)都可以返回一个迭代器。迭代器是一个有 __next__() 方法的对象,这个方法会返回序列中的下一个对象,并且会抛出一个叫做 StopIteration 的异常,表示没有更多的对象可以返回了。

9

Python的官方文档里是这么说的:

为了让容器对象可以被遍历,需要定义一个方法:

container.__iter__()

这个方法要返回一个迭代器对象。这个对象需要支持下面提到的迭代器协议。如果一个容器支持不同的遍历方式,可以提供额外的方法来专门请求这些遍历方式的迭代器。比如,一个树形结构就可以支持宽度优先和深度优先的遍历。

这个方法在Python/C API中对应的是Python对象类型结构的tp_iter槽位。

迭代器对象本身需要支持以下两个方法,这两个方法一起构成了迭代器协议:

iterator.__iter__()

返回迭代器对象本身。这个方法是必须的,目的是让容器和迭代器都能在for循环和in语句中使用。这个方法在Python/C API中对应的是Python对象类型结构的tp_iter槽位。

iterator.next()

从容器中返回下一个项目。如果没有更多的项目了,就抛出StopIteration异常。这方法在Python/C API中对应的是Python对象类型结构的tp_iternext槽位。

65

要让一个类可以被遍历,你需要写一个叫做 __iter__() 的方法,这个方法会返回一个迭代器:

class MyList(object):
    def __init__(self):
        self.list = [42, 3.1415, "Hello World!"]
    def __iter__(self):
        return iter(self.list)

m = MyList()
for x in m:
    print(x)

打印输出

42
3.1415
Hello World!

这个例子使用了列表迭代器,但你也可以自己写一个迭代器。你可以让 __iter__() 成为一个 生成器,或者返回一个定义了 __next__() 方法的迭代器类的实例。

撰写回答