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()方法生成迭代器物件。
等價於:
到此為止:生成器,迭代器,可迭代物件全部講完了。