3. Python3 中的迭代器

  • 迭代器的定義:具有__next__(或者next,python2)方法的對象裸删。
  • 自動可迭代的迭代器:實現(xiàn)__iter__方法的迭代器八拱。通常迭代器是指自動可迭代的迭代器
  • 迭代器的優(yōu)勢:相比使用List迭代,如果迭代數(shù)據(jù)量很大涯塔,List方法將消耗大量內(nèi)存肌稻,而迭代器可以節(jié)約不少內(nèi)存。獲取速度和內(nèi)存的提升匕荸。
  • 其他優(yōu)勢:簡單爹谭、通用、優(yōu)雅
  • 迭代器的終止:采用異常機制榛搔,在__next__中無法提供下一個值的時候诺凡,拋出 raise StopIteration 即可。
  • 迭代器的使用技巧:a) 直接到元組践惑,鏈表绑洛;b)生成一次,只使用一次童本。當然重新初始化也是可行的真屯,不建議用。

失敗的版本

以 Fibs 數(shù)列為例子穷娱。

>>> class Fibs():
...     def __init__(self):
...         self.a = 0
...         self.b = 1
...     def __next__(self):
...         self.a, self.b = self.b, self.a+self.b
...         return self.a
... 
>>> fibs = Fibs()
>>> print(fibs.__next__(),fibs.__next__(),fibs.__next__(),fibs.__next__(),fibs.__next__(),fibs.__next__())
1 1 2 3 5 8
>>> for f in fibs:
...     print(f)
...     if (f>100):
...         break
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Fibs' object is not iterable

錯誤提示為:Fibs的對象確實是迭代器(能夠手動通過__next__給出迭代結(jié)果)绑蔫,但是不可自動迭代。盡管我們已經(jīng)有了__next__的方法泵额,卻沒有實現(xiàn)__iter__方法配深。

成功的版本

>>> class Fibs():
...     def __init__(self):
...         self.a = 0
...         self.b = 1
...     def __next__(self):
...         self.a, self.b = self.b, self.a+self.b
...         return self.a
...     def __iter__(self):
...         return self
... 
>>> fibs = Fibs()
>>> print(fibs.__next__(),fibs.__next__(),fibs.__next__(),fibs.__next__(),fibs.__next__(),fibs.__next__())
1 1 2 3 5 8
>>> for f in fibs:
...     print(f)
...     if (f>100):
...         break
... 
13 21 34 55 89 144

添加了__iter__函數(shù),該迭代器可以自動迭代了嫁盲。注意篓叶,自動迭代是在手動迭代的基礎(chǔ)上繼續(xù)進行的烈掠。

  • 迭代器的終止
    上述例子是通過 if語句主動終止的,如果別人使用你的迭代器缸托,不主動終止左敌,那么肯定就爆了(我已經(jīng)重新啟動過電腦一次了)。主動的終止方式是采用異常 raise StopIteration 即可
>>> class Fibs():
...     def __init__(self):
...         self.a = 0
...         self.b = 1
...     def __next__(self):
...         self.a, self.b = self.b, self.a+self.b
...         if self.a > 100: raise StopIteration
...         return self.a
...     def __iter__(self):
...         return self
... 
>>> fibs = Fibs()
>>> for f in fibs:
...     print(f)
... 
1 1 2 3 5 8 13 21 34 55 89

這樣便不需要額外的stop停止語句俐镐。

從迭代器到序列

直接使用truple矫限、list函數(shù)轉(zhuǎn)換

>>> class Fibs():
...     def __init__(self):
...         self.a = 0
...         self.b = 1
...     def __next__(self):
...         self.a, self.b = self.b, self.a+self.b
...         if self.a > 100: raise StopIteration
...         return self.a
...     def __iter__(self):
...         return self
... 
>>> fibs = Fibs()
>>> print(tuple(fibs))
(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89)
>>> fibs = Fibs()
>>> print(list(fibs))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

注意: 迭代器用完了之后,需要重置佩抹,不然得不到你要的結(jié)果叼风。最佳的使用方式是用一次,建立一次棍苹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末无宿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枢里,更是在濱河造成了極大的恐慌懈贺,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坡垫,死亡現(xiàn)場離奇詭異梭灿,居然都是意外死亡,警方通過查閱死者的電腦和手機冰悠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門堡妒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溉卓,你說我怎么就攤上這事皮迟。” “怎么了桑寨?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵伏尼,是天一觀的道長。 經(jīng)常有香客問我尉尾,道長爆阶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任沙咏,我火速辦了婚禮辨图,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肢藐。我一直安慰自己故河,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布吆豹。 她就那樣靜靜地躺著鱼的,像睡著了一般理盆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凑阶,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天猿规,我揣著相機與錄音,去河邊找鬼晌砾。 笑死坎拐,一個胖子當著我的面吹牛烦磁,可吹牛的內(nèi)容都是我干的养匈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼都伪,長吁一口氣:“原來是場噩夢啊……” “哼呕乎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起陨晶,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤猬仁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后先誉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湿刽,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年褐耳,在試婚紗的時候發(fā)現(xiàn)自己被綠了诈闺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡铃芦,死狀恐怖雅镊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刃滓,我是刑警寧澤仁烹,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站咧虎,受9級特大地震影響卓缰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砰诵,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一僚饭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胧砰,春花似錦鳍鸵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽击罪。三九已至,卻和暖如春贪薪,著一層夾襖步出監(jiān)牢的瞬間媳禁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工画切, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竣稽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓霍弹,卻偏偏與公主長得像毫别,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子典格,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 迭代器(Iterable) 簡單來說岛宦,迭代器對象(my_list)可以讓以下代碼正常工作: 如果對象實現(xiàn)了__it...
    SOLAREST閱讀 539評論 0 1
  • PYTHON-進階-ITERTOOLS模塊小結(jié)轉(zhuǎn)自wklken:http://wklken.me/posts/20...
    C_Y_閱讀 955評論 0 2
  • 對于list、string耍缴、tuple砾肺、dict等這些容器對象,使用for循環(huán)遍歷是很方便的。在后臺for語句對容...
    菜鳥辣媽閱讀 2,398評論 0 1
  • “老板防嗡,還有蛋糕嗎变汪?” “沒了∫铣茫” “哦裙盾,那算了∪俚拢” “你什么時候要闷煤?” “現(xiàn)在′陶埃” “袄鹉谩?” “現(xiàn)在署咽!” “好近顷,...
    我是大臉喵呀閱讀 1,624評論 2 1
  • 矗立在戈壁 默默無語也風流 一段奇景千古蒼涼 鑄就一生絕唱 留下那蓬勃的滄桑 是你 裝扮了這片亙古寂滅的土地 召喚...
    瀚正閱讀 411評論 0 4