1 l=[1,2,3,4] 2 3 for n in l: 4 print n
在看上面這段代碼的時候,咱們沒有顯式的控制列表的偏移量,就能夠自動的遍歷了整個列表對象。那麼for 語句是怎麼來遍歷列表l的呢?要回答這個問題,咱們必須首先來看一下迭代器相關的知識。python
1.迭代器函數
迭代器對象要求支持迭代器協議,所謂支持迭代器協議就是對象包含__iter__()和next()方法。其中__iter__()方法返回迭代器對象本身;next()方法返回下一個前進到下一個結果,在結尾時引起StopIteration異常。oop
列表不是迭代器對象,可是列表經過__iter__()能夠獲得一個迭代器對象來遍歷整個列表的內容,像列表這樣的序列對象都屬於這種狀況;與序列不一樣,文件對象自己就是一種迭代器對象。spa
1 l=[1,2,3,4] 2 f=open('test.c','r') 3 4 iter(l) == l 5 Out[131]: False 6 7 iter (f)== f 8 Out[132]: True
一個迭代器的例子(來源:python tutorial)code
1 class Reverse: 2 """Iterator for looping over a sequence backwards.""" 3 def __init__(self, data): 4 self.data = data 5 self.index = len(data) 6 def __iter__(self): 7 return self 8 def next(self): 9 if self.index == 0: 10 raise StopIteration 11 self.index = self.index - 1 12 return self.data[self.index]
2.生成器對象
生成器使python能夠很容易的支持迭代協議。生成器經過生成器函數產生,生成器函數能夠經過常規的def語句來定義,可是不用return返回,而是用yeild一次返回一個結果,在每一個結果之間掛起和繼續它們的狀態,來自動實現迭代協議。blog
一個生成器的例子(來源:python tutorial)ip
3.for語句如何工做it
在咱們最前面的遍歷列表的for語句中,for使用了列表支持迭代器的性質,能夠每次經過調用迭代器的next()方法,來遍歷到列表中的值,直到遇到StopIteration的異常。io
4.注意的問題:
參考: python tutorial, stackoverflow