什么让Python中的对象可迭代
在Python中,什么东西是可迭代的?也就是说,能不能用for
循环来遍历它?
我可以在Python中创建一个可迭代的类吗?如果可以的话,应该怎么做?
4 个回答
任何有 __iter__()
方法的对象都被认为是可迭代的。
另外,任何序列(也就是那些有 __getitem__()
方法的对象)都可以返回一个迭代器。迭代器是一个有 __next__()
方法的对象,这个方法会返回序列中的下一个对象,并且会抛出一个叫做 StopIteration 的异常,表示没有更多的对象可以返回了。
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槽位。
要让一个类可以被遍历,你需要写一个叫做 __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__()
方法的迭代器类的实例。