python 生成器 & 迭代器

在聊生成器以前,咱們先看看什麼是生成式?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 對象。

相關文章
相關標籤/搜索