1. 程式人生 > 實用技巧 >迭代器、生成器

迭代器、生成器

迭代器
對於list、string、tuple、dict等這些容器物件,使用for迴圈遍歷是很方便的。在後臺for語句對容器物件呼叫iter()函式。iter()是python內建函式。
iter()函式會返回一個定義了next()方法的迭代器物件,它在容器中逐個訪問容器內的元素。next()也是python內建函式。在沒有後續元素時,next()會丟擲一個StopIteration異常,通知for語句迴圈結束。

for item in Iterable(list、tuple、dic)

迭代器協議是指:物件提供next方法,要麼返回迭代中的下一項,要麼引起一個異常(sropiteration),終止迭代。
python 中檔案實現了迭代器協議。

with oper('/etc/passwd') as f:
      for line in f:
            print line

生成器
延遲操作,也就是在需要的時候才產生結果,不是立即產生結果。
生成器是隻能遍歷一次的。因為,它並沒有把所有的值存在記憶體中,而是在執行中生成。
生成器是一類特殊的迭代器。
使用yield而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函式的狀態,以便下次從它離開的地方繼續執行。
提供生成器方式:
1)生成器函式

      def gensquares(N):
            for i in range(N):
                  yield i ** 2
      for item in gensquares(5):
                  print(item)     

受到記憶體的限制,列表的容量是有限的。如果建立包含100萬個元素的列表,在只需要前幾個元素的情況下,佔用很大的儲存空間,浪費空間。
如果列表的元素可以按照演算法推算出來,就不必建立完整的list,從而節省空間。

2)普通函式

https://www.jb51.net/article/134844.htm
https://www.zhihu.com/question/20829330/answer/133606850