python中迭代器和生成器

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

1 def reverse(data):
2     for index in range(len(data)-1, -1, -1):
3         yield data[index]

3.for語句如何工做it

在咱們最前面的遍歷列表的for語句中,for使用了列表支持迭代器的性質,能夠每次經過調用迭代器的next()方法,來遍歷到列表中的值,直到遇到StopIteration的異常。io

4.注意的問題:

  1. 像列表這種序列類型的對象,咱們能夠經過iter()來產生多個迭代器,在迭代的過程當中各個迭代器相互對立;可是迭代器對象無法經過iter()方法來產生多個不一樣的迭代器,它們都指向了自身,因此無法獨立使用。

參考: python tutorial, stackoverflow

相關文章
相關標籤/搜索