什么使python中的东西可迭代

zud*_*duz 45 python

是什么让Python中的东西可迭代?即.可以用它循环for

我可以在Python中创建一个可迭代的类吗?如果是这样,怎么样?

Sve*_*ach 57

要使类可迭代,请编写一个__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)
Run Code Online (Sandbox Code Playgroud)

版画

42
3.1415
Hello World!
Run Code Online (Sandbox Code Playgroud)

该示例使用一个列表迭代器,但你也可以写由制作自己的迭代器__iter__()一个发电机或通过返回一个迭代器类来定义的实例__next__()方法.

  • `__getitem__`还有另一种方法,请参阅http://stackoverflow.com/a/9884259/284795 (4认同)

Nat*_*ate 8

Python文档描述的正是这种:

需要为容器对象定义一个方法以提供迭代支持:

container.__iter__()
Run Code Online (Sandbox Code Playgroud)

返回一个迭代器对象.该对象需要支持下面描述的迭代器协议.如果容器支持不同类型的迭代,则可以提供其他方法来专门请求这些迭代类型的迭代器.(支持多种迭代形式的对象的示例是支持广度优先和深度优先遍历的树结构.)此方法对应于Python/C API中Python对象的类型结构的tp_iter槽.

迭代器对象本身需要支持以下两种方法,它们共同构成迭代器协议:

iterator.__iter__()
Run Code Online (Sandbox Code Playgroud)

返回迭代器对象本身.这是允许容器和迭代器与for和in语句一起使用所必需的.此方法对应于Python/C API中Python对象的类型结构的tp_iter槽.

iterator.next()
Run Code Online (Sandbox Code Playgroud)

从容器中返回下一个项目.如果没有其他项,请提高StopIteration异常.此方法对应于Python/C API中Python对象的类型结构的tp_iternext槽.


mar*_*lhc 5

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

此外,任何序列(具有__getitem__()方法的对象)都可以返回迭代器。迭代器是具有__next__()方法的对象,该方法可返回序列中的下一个对象并引发StopIteration异常。