最近學習了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()方法生成迭代器物件。
等價於:
到此為止:生成器,迭代器,可迭代物件全部講完了。
迭代器,生成器,可迭代
生成器有兩種 生成器表示式 x x for x in 1,2,3 yield表示式 def fib max n,a,b 0,0,1 while n max yield b a,b b,a b n n 1 return done 迭代器,有next 方法可以通過next 不斷地獲得下乙個元素的就是迭代...
Python 可迭代物件 迭代器 生成器
在討論可迭代物件和迭代器之前,我們先來了解一下什麼是迭代器 迭代器是一種最簡單也最常見的設計模式。它可以讓使用者透過特定的介面巡訪容器中的每乙個元素而不用了解底層的實現。維基百科 迭代是資料處理的基石。當記憶體中放不下資料集時,我們要找到一種惰性獲取資料的方式,即按需一次獲取乙個資料項,這就是迭代器...
python可迭代物件 迭代器 生成器
乙個擁有 iter 方法的物件,可以使用for迴圈遍歷 可迭代物件有 str list tuple dict set iterator generator file 判斷乙個物件是否可迭代 from collections import iterable isinstance abc iterabl...