網上許多文章說Python的for語句中,in關鍵字后面的對象是一個集合。例如
for i in [1,2,3] PRint i上面代碼中in關鍵字后面的對象[1,2,3]是一個list,也是一個集合。但in關鍵字后面的對象其實不必是一個集合。后面接一個序列對象也是合法的。 例如
myrange = MyRange(0, 10)for i in myrange: print i上面代碼中的myrange對象是一個序列對象,但不是集合。參見上一篇博文。事實上,for語句中in關鍵字后面的對象也不必是序列對象,它只需要是一個可迭代對象(Iterable)即可。
一個可迭代的對象需要滿足下面兩個條件之一:
它實現了__iter__方法。該方法會返回一個迭代器對象?;蛘咚且粋€序列對象。注意:如果一個類型實現了__iter__方法,那么在該方法中顯式地給出了與該類型相關的迭代器如何構造??墒?,對于序列類型來說,它有一個很天然的迭代器。因此,無需通過實現__iter__方法來顯式定義。下一篇博文將介紹如何通過序列對象構造天然的迭代器。這里先介紹迭代器對象的嚴格定義。
一個迭代器,本質上也是一個序列。它需要實現下面兩個方法。
next方法(老版本的Python叫__next__方法)。當第11次調用next方法時,會返回序列的第1個元素;當第2次調用next方法時,會返回序列的第2個元素;當序列中的元素耗盡,拋出StopIteration異常。__iter__方法。前面說過__iter__方法通常返回迭代器對象。因此,對于一個迭代器來說,它的__iter__方法只需返回其本身即可。通過上面的定義,我們知道,一個迭代器對象,也必是可迭代的。
下面的代碼定義了一個迭代器。
class MyIterator: def __init__(self, start, end): self.start = start self.end = end def next(self): if self.start >= self.end: raise StopIteration self.start = self.start + 1 return self.start - 1 def __iter__(self): return self測試代碼myiter = MyIterator(0, 2)print myiter.next()print myiter.next()print myiter.next()輸出結果如下01Traceback (most recent call last): File "test.py", line 27, in <module> print myiter.next() File "test.py", line 16, in next raise StopIterationStopIteration下面的代碼測試在for語句中使用迭代器
myiter = MyIterator(0, 10)for i in myiter: print i輸出結果0123456789在下一篇博文中,將繼續介紹for語句的工作原理。
新聞熱點
疑難解答