chapter14 可迭代的對象与倡,迭代器跟生成器

Python中界逛,所有的集合都可以迭代。在語言內部中纺座,迭代器主要用于:

  • for循環(huán)
  • 構建和擴展集合類型
  • 逐行遍歷文件文本
  • 列表推導息拜,字典推導跟集合推導
  • 元組拆包
  • 調用函數(shù)時,用*拆包實參

序列可以迭代的原因: iter函數(shù)

解釋器需要迭代對象x時净响,會自動調用iter(x).
內置的iter函數(shù)有以下作用:

  1. 檢查對象是否實現(xiàn)了__iter__方法,如果實現(xiàn)了就調用它,獲取一個迭代器.
  2. 如果沒有__iter__方法,尋找__getitem__方法,嘗試按照順序(index為0開始)獲取元素.
  3. 如果都沒有,python拋出TypeError異常.提示"x object is not iterable. x為目標對象所屬的類. 在白鵝類型理論中,可迭代對象的定義更為簡單,實現(xiàn)了iter方法即可.因為abc.Iterable類實現(xiàn)了subclasshook`方法少欺。

標準的迭代器接口有兩個方法

__next__: 返回下一個可用的元素。如無馋贤,則拋出StopIteration異常赞别。在collections.abc.Iterator抽象基類中定義。繼承自Iterable類.
__iter__: 返回self,以便在應該使用可迭代對象的地方使用迭代器配乓。例如for循環(huán)中仿滔。定義在Iterable類中.

uml類圖

迭代器定義

迭代器是這樣的對象:實現(xiàn)了無參數(shù)的__next__方法,返回序列中的下一個元素,如沒有元素了,就拋出StopIteration異常.
Python中的迭代器還實現(xiàn)了__iter__方法,所有迭代器也可以迭代.

可迭代對象與迭代器的對比

python從可迭代對象中獲取迭代器。
要知道

  • 可迭代對象有個__iter__方法犹芹,每次都實例化一個新的迭代器崎页;
  • 而迭代器要實現(xiàn)__next__ 方法,返回單個元素羽莺,還要實現(xiàn)__iter__方法实昨,返回迭代器本身。
    因此盐固,迭代器可以迭代荒给,但是可迭代對象不是迭代器。
    兩個結論:
  • 可迭代的對象一定不能是自身的迭代器刁卜,也就是說志电,可迭代的對象必須實現(xiàn)__iter__方法,但不能實現(xiàn)__next__ 方法
  • 另一方面蛔趴,迭代器應該一直可以迭代挑辆,所有迭代器的__iter__方法應該返回自身。

生成器函數(shù)

生成器函數(shù)的工作原理

只要python函數(shù)的定義體中有yield關鍵字,該函數(shù)就是生成器函數(shù)鱼蝉。

生成器表達式

可以理解為列表推導的惰性版本洒嗤。是制造生成器的工廠。

何時使用生成器表達式

當生成器函數(shù)比較簡單時魁亦。

python中的自帶生成器函數(shù)渔隶。

  • 用于過濾
  • 用于映射
  • 合并多個可迭代對象
  • 用于重新排列元素的生成器函數(shù)

新語法 yield from

如果生成器函數(shù)需要產出另一個生成器生成的值,傳統(tǒng)方法是使用嵌套的for循環(huán).
yield from 其實就是代替了內部的for循環(huán).獲取到內部生成器產生的值
常用在協(xié)程上。

可迭代的歸約函數(shù)

image.png

深入分析iter函數(shù)

可以傳入兩個參數(shù)洁奈。第一個參數(shù)必須是可調用的對象间唉,用于不斷調(該對象沒有參數(shù)), 產出各個值,第二個值可以看做是個終止條件利术,當?shù)谝粋€參數(shù)對象調用返回改值時呈野。迭代器拋出StopIteration異常。停止迭代印叁。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末被冒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轮蜕,更是在濱河造成了極大的恐慌姆打,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肠虽,死亡現(xiàn)場離奇詭異幔戏,居然都是意外死亡,警方通過查閱死者的電腦和手機税课,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門闲延,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人韩玩,你說我怎么就攤上這事垒玲。” “怎么了找颓?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵合愈,是天一觀的道長。 經常有香客問我击狮,道長佛析,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任彪蓬,我火速辦了婚禮寸莫,結果婚禮上,老公的妹妹穿的比我還像新娘档冬。我一直安慰自己膘茎,他們只是感情好桃纯,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著披坏,像睡著了一般态坦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棒拂,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天驮配,我揣著相機與錄音,去河邊找鬼着茸。 笑死,一個胖子當著我的面吹牛琐旁,可吹牛的內容都是我干的涮阔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灰殴,長吁一口氣:“原來是場噩夢啊……” “哼敬特!你這毒婦竟也來了?” 一聲冷哼從身側響起牺陶,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤伟阔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掰伸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皱炉,經...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年狮鸭,在試婚紗的時候發(fā)現(xiàn)自己被綠了合搅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡歧蕉,死狀恐怖灾部,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情惯退,我是刑警寧澤赌髓,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站催跪,受9級特大地震影響锁蠕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜懊蒸,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一匿沛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榛鼎,春花似錦逃呼、人聲如沸鳖孤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苏揣。三九已至,卻和暖如春推姻,著一層夾襖步出監(jiān)牢的瞬間平匈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工藏古, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留增炭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓拧晕,卻偏偏與公主長得像隙姿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厂捞,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容