在聊生成器以前,咱們先看看什麼是生成式?python
a = [i*2 for i in range(10) ] 相似於這樣的就是生成式併發
而把列表 「 [ ] 」 符號換成 " () " 則就稱爲 generator 類型python2.7
什麼是生成器?函數
在 Python 中,使用了 yield 的函數被稱爲生成器。spa
跟普通函數不一樣的是,生成器是一個返回迭代器的函數,只能用於迭代操做,更簡單點理解生成器就是一個迭代器。線程
生成器的特色:對象
1).只有在調用時纔會生成相應的數據blog
2).只記錄當前位置內存
3).只有一個__next__() 方法。在python2.7中是 next()generator
下面咱們用斐波那契數列,寫一個生成器:
那麼咱們爲何要用生成器,它的優勢是什麼呢?
因爲生成器只有在調用時,纔會生成數據,因此它能夠節省內存佔用。並且生成器可在單線程下實現併發運算處理效果,這點很牛逼。
如下是並行效果代碼演示:
接下來咱們來看看什麼是迭代器?
咱們知道,能夠直接做用於for 循環的數據類型有如下幾種:
一類是集合數據類型,如 list、tuple、dict、set、str 等;
一類是generator,包括生成器和帶yield的generator function。
咱們把這些能夠直接做用於for循環的對象統稱爲可迭代對象:Iterable 。
像生成器這樣,不但能夠做用於for循環,還能夠被next() 函數不斷調用並返回下一個值,
直到最後拋出StopIteration 錯誤表示沒法繼續返回下一個值了。咱們把這種能夠被next()函數
調用並不斷返回下一個值的對象稱爲迭代器:Iterator。
因而可知,咱們能夠知道,生成器確定是一個迭代器,但迭代器不必定是生成器。
固然咱們也可使用 iter() 函數,把可迭代對象(Iterable)變成迭代器(Iterator)
小結:
凡是可做用於for 循環的對象都是 Iterable 類型;
凡是可做用於next() 函數的對象都是Iterator類型,它們表示一個惰性計算的序列;
集合數據類型如list 、dict、str等是Iterable但不是Iterator,不過能夠經過iter() 函數得到一個 Iterator 對象。