2011-03-10 103 views

回答

50

要使类可迭代,请编写一个返回迭代器的方法__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()一个迭代器类的实例编写自己的迭代器方法。

+2

还有'__getitem__'的另一种方法,请参阅http://stackoverflow.com/a/9884259/284795 – 2015-07-12 13:10:45

+0

@ColonelPanic是正确的,如果您定义'__getitem__',该类也是可迭代的。但是它会忽略你也定义了'__len__'并且只是无限地迭代。 – jlh 2017-10-24 20:52:20

2

question可以帮助你,它描述了如何使一个迭代符

8

Python documentation精确地描述了这一点:

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

container.__iter__() 

Return it iter ator对象。该对象需要支持下面描述的迭代器协议。如果一个容器支持不同类型的迭代,可以提供额外的方法来专门为这些迭代类型请求迭代器。 (支持多种迭代形式的对象的一个​​例子是支持广度优先和深度优先遍历的树结构。)此方法对应于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插槽。

0

你会想next()__iter__()方法。 Here's a nice little tutorial

+0

该教程仅适用于Python 2.对于记录,发布此答案时存在Python 3。这里是Python 3的[一](http://nvie.com/posts/iterators-vs-generators/)。 – 2017-04-18 17:28:36

4

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

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

相关问题