1. 程式人生 > >python中的生成器、迭代器,可迭代物件

python中的生成器、迭代器,可迭代物件

最近學習了python中的生成器、迭代器、可迭代物件的知識,現在回顧一下,鞏固理解

先說一下列表生成式:

執行結果如下:

通過方括號加入裡面的表示式,從而生成一個列表,在這裡注意一下,列表生成時也可以加入函式:

結果如下:

 

計算了X的三次方,結果存放在列表中。

生成器:

生成器的兩種方式:一種是通過小括號()  一種是通過yield關鍵字,這裡yield相當於return,不同之處在於yield結束

後會儲存此時函式的狀態。

先看第一種方式:

結果:

從結果看出gene_a 是一個生成器物件。

生成器物件的特點:

1:在你用到資料的時候,會給你生成,從而節省記憶體空間

2:不能跳躍取值,即只能順序的生成值,

3:生成器是可迭代物件(後面會講到什麼是可迭代物件)

來看程式碼:

結果:

從結果我們可以看出,可以通過生成器物件進行取值。取值的方式有兩種:一種是通過__next__()這種內建方法,但是不推薦使用。python2中採用的是next()方法,python3中採用的是next()的內建方法,使用效果如下next(gene_a)。

第4次next會丟擲異常,超過迭代的範圍,停止迭代。

也可以同通過for來進行資料生成:

結果:

這裡面for內部做了兩件事:

1:執行next方法

2:處理stopIteration異常

第二種生成方式時通過yield關鍵字:

結果:

我們可以看到gene_b 是一個生成器物件。那func2就是一個生成器函式。在這裡yield就相當於return,進行for遍歷時,for內部會自動給我們執行next(gene_b)功能,將返回值賦值給i,所以第一個next會列印1,當執行第二次next時,會找到第一次yield結束時儲存的斷點資訊繼續執行。所以第二次會打印出2。

增加一個小知識點: 生成器物件還有一個方法為send(), send()方法和next()方法的功能差不多。只不過send()方法可以傳遞引數。傳遞的引數會賦值給yield返回值的變數。value = yield 1。這裡需要注意:第一次send前如果沒有next只能進行必須執行send(None)

至此:生成器的兩種生成方式已經講解完畢。

什麼是可迭代物件?

物件內部具有__iter__()方法的都是可迭代物件,比如列表,元祖,字典,字串等,生成器也是可迭代物件。

迭代器:

先記住一句話: 生成器都是迭代器,迭代器不一定是生成器

迭代器定義:滿足迭代器協議,協議為:1 有iter()方法,2 有next()方法

iter() 返回一個迭代器物件

將生成器的時候,說了for內部做了兩件事,但是在迭代器中for除了那兩件事還有一個事要做。就是通過iter()方法生成迭代器物件。

等價於:

到此為止:生成器,迭代器,可迭代物件全部講完了。