【问题标题】:What makes something iterable in python是什么让python中的东西可以迭代
【发布时间】:2011-07-12 20:16:46
【问题描述】:

是什么让 Python 中的东西可以迭代? IE。可以用for循环遍历它

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

【问题讨论】:

    标签: python


    【解决方案1】:

    要使类可迭代,请编写一个返回迭代器的__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
    • @ColonelPanic 是对的,如果你定义了__getitem__,这个类也是可迭代的。但是它会忽略您还定义了 __len__ 并且只是无限期地迭代。
    【解决方案2】:

    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 槽。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您需要next()__iter__() 方法。 Here's a nice little tutorial.

        【讨论】:

        • 该教程仅适用于 Python 2。为了记录,发布此答案时 Python 3 已经存在。这是 Python 3 的one
        猜你喜欢
        • 2020-01-27
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 2014-08-12
        • 2011-09-12
        • 1970-01-01
        • 2011-02-03
        相关资源
        最近更新 更多