【发布时间】:2011-07-12 20:16:46
【问题描述】:
是什么让 Python 中的东西可以迭代? IE。可以用for循环遍历它
我可以在 Python 中创建一个可迭代的类吗?如果有,怎么做?
【问题讨论】:
标签: python
是什么让 Python 中的东西可以迭代? IE。可以用for循环遍历它
我可以在 Python 中创建一个可迭代的类吗?如果有,怎么做?
【问题讨论】:
标签: python
要使类可迭代,请编写一个返回迭代器的__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__() 设为generator 或返回定义__next__() 方法的迭代器类的实例来编写自己的迭代器。
【讨论】:
__getitem__还有另一种方式,见stackoverflow.com/a/9884259/284795
__getitem__,这个类也是可迭代的。但是它会忽略您还定义了 __len__ 并且只是无限期地迭代。
Python documentation 正是这样描述的:
需要为容器对象定义一个方法来提供迭代支持:
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__() 方法的对象都被视为可迭代对象。
此外,任何序列(具有__getitem__() 方法的对象)都可以返回一个迭代器。迭代器是一个带有__next__() 方法的对象,它返回序列中的下一个对象并抛出一个 StopIteration 异常。
【讨论】:
您需要next() 和__iter__() 方法。 Here's a nice little tutorial.
【讨论】: