2011-03-10 86 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異常。

相關問題