亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

一篇文章弄懂Python中的可迭代對(duì)象、迭代器和生成器

系統(tǒng) 1957 0

我們都知道,序列可以迭代。但是,你知道為什么嗎? 本文來探討一下迭代背后的原理。

序列可以迭代的原因:iter 函數(shù)。解釋器需要迭代對(duì)象 x 時(shí),會(huì)自動(dòng)調(diào)用 iter(x)。內(nèi)置的 iter 函數(shù)有以下作用:

(1) 檢查對(duì)象是否實(shí)現(xiàn)了 iter 方法,如果實(shí)現(xiàn)了就調(diào)用它,獲取一個(gè)迭代器。

(2) 如果沒有實(shí)現(xiàn) iter 方法,但是實(shí)現(xiàn)了 getitem 方法,而且其參數(shù)是從零開始的索引,Python 會(huì)創(chuàng)建一個(gè)迭代器,嘗試按順序(從索引 0 開始)獲取元素。

(3) 如果前面兩步都失敗,Python 拋出 TypeError 異常,通常會(huì)提示“C objectis not iterable”(C 對(duì)象不可迭代),其中 C 是目標(biāo)對(duì)象所屬的類。

由此我們可以明確知道什么是 可迭代的對(duì)象: 使用 iter 內(nèi)置函數(shù)可以獲取迭代器的對(duì)象。即要么對(duì)象實(shí)現(xiàn)了能返回迭代器的 iter 方法,要么對(duì)象實(shí)現(xiàn)了 getitem 方法,而且其參數(shù)是從零開始的索引。

下面看一個(gè)實(shí)現(xiàn)了getitem方法的例子:

一篇文章弄懂Python中的可迭代對(duì)象、迭代器和生成器_第1張圖片

輸出結(jié)果:

一篇文章弄懂Python中的可迭代對(duì)象、迭代器和生成器_第2張圖片

我們創(chuàng)建了一個(gè)類Eg1,并且為這個(gè)類實(shí)現(xiàn)了 getitem 方法, 它的實(shí)例化對(duì)象o1 就是可迭代對(duì)象。

下面我們看一個(gè)實(shí)現(xiàn) iter 方法的例子,因?yàn)橛玫搅说鳎栽诖宋覀儽仨氃诿鞔_一下迭代器的用法。 標(biāo)準(zhǔn)的迭代器接口有兩個(gè)方法:

返回下一個(gè)可用的元素,如果沒有元素了,拋出 StopIteration異常。

返回 self,以便在應(yīng)該使用可迭代對(duì)象的地方使用迭代器,例如在 for 循環(huán)中。

一篇文章弄懂Python中的可迭代對(duì)象、迭代器和生成器_第3張圖片

我們創(chuàng)建了Eg2類,并為它實(shí)現(xiàn)了 iter 方法,此方法返回一個(gè)迭代器Eg2Iterator。 Eg2Iterator 實(shí)現(xiàn)了我們之前所說的next和iter方法。 實(shí)例化對(duì)象,并循環(huán)輸出:

一篇文章弄懂Python中的可迭代對(duì)象、迭代器和生成器_第4張圖片

可見,和o1是一樣的。

我們通過兩種方法實(shí)現(xiàn)了一個(gè)自己的可迭代對(duì)象,再此過程中我們要明確可迭代的對(duì)象和迭代器之間的關(guān)系:

Python 從可迭代的對(duì)象中獲取迭代器。

iter方法從我們自己創(chuàng)建的迭代器類中獲取迭代器,而getitem方法是python內(nèi)部自動(dòng)創(chuàng)建迭代器。

至此,我們明白了如何正確地實(shí)現(xiàn)可迭代對(duì)象,并且引出了怎樣實(shí)現(xiàn)迭代器,但是使用迭代器方法(即上面的例子2)的代碼量有點(diǎn)大,下面我們來了解一下如何使用更符合 Python 習(xí)慣的方式實(shí)現(xiàn) Eg2類。

一篇文章弄懂Python中的可迭代對(duì)象、迭代器和生成器_第5張圖片

哦了!就這么簡(jiǎn)單優(yōu)雅!不用再單獨(dú)定義一個(gè)迭代器類!

這里我們使用了yield 關(guān)鍵字, 只要 Python 函數(shù)的定義體中有 yield 關(guān)鍵字,該函數(shù)就是生成器函數(shù)。調(diào)用生成器函數(shù)時(shí),會(huì)返回一個(gè)生成器對(duì)象。也就是說,生成器函數(shù)是生成器工廠。 當(dāng)然,例子3的代碼還可以使用yield from進(jìn)一步簡(jiǎn)化:

一篇文章弄懂Python中的可迭代對(duì)象、迭代器和生成器_第6張圖片

到這里我們明白了 可迭代對(duì)象 和 迭代器,還引申出了生成器,但還有一點(diǎn)沒有提,那就是生成器表達(dá)式。

使用生成器表達(dá)式例子4的代碼可以修改為:

一篇文章弄懂Python中的可迭代對(duì)象、迭代器和生成器_第7張圖片

在python中,所有生成器都是迭代器。

最后,總結(jié)一下:

(1)什么是可迭代對(duì)象? 可迭代對(duì)象要么實(shí)現(xiàn)了能返回迭代器的 iter 方法,要么實(shí)現(xiàn)了 getitem 方法而且其參數(shù)是從零開始的索引。

(2)什么是迭代器? 迭代器是這樣的對(duì)象:實(shí)現(xiàn)了無(wú)參數(shù)的 next 方法,返回下一個(gè)元素,如果沒有元素了,那么拋出 StopIteration 異常;并且實(shí)現(xiàn)iter 方法,返回迭代器本身。

(3)什么是生成器? 生成器是帶有 yield 關(guān)鍵字的函數(shù)。調(diào)用生成器函數(shù)時(shí),會(huì)返回一個(gè)生成器對(duì)象。

(4)什么是生成器表達(dá)式? 生成器表達(dá)式是創(chuàng)建生成器的簡(jiǎn)潔句法,這樣無(wú)需先定義函數(shù)再調(diào)用。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 欧美日韩成人高清色视频 | 中文字幕曰韩一区二区不卡 | 欧美一级毛片在线看视频 | 超级乱淫视频aⅴ播放视频 超级乱淫视频播放日韩 | 国产高清成人mv在线观看 | 久久青草免费97线频观 | 九九色在线视频 | 中文字幕久久亚洲一区 | 国产大尺度福利视频在线观看 | 欧美一级毛片特黄黄 | 精品一区二区三区在线观看l | 九九热只有精品 | 四虎影视在线看免费 720p | 国产精品亚洲精品观看不卡 | 日本综合欧美一区二区三区 | 精品精品国产欧美在线观看 | 欧美成人免费大片888 | 国产欧美日韩亚洲 | 亚洲综合激情 | 欧美一级毛片欧美毛片视频 | 国产成人精品综合网站 | 久久精品色 | 午夜视频在线网站 | 成人精品在线 | 日韩毛片免费在线观看 | 久久久久久国产精品视频 | 另类尿喷潮videofree | 最新国产午夜精品视频成人 | 久久久久久久亚洲精品 | 国产一二三区在线观看 | 一级免费黄色毛片 | 亚洲视频在线不卡 | 9久热这里只有精品视频在线观看 | 国产高清视频在线 | 免费人成在线观看网站品爱网 | 久久99亚洲精品久久久久 | 水蜜桃久久 | 欧美成人精品久久精品 | 国产高清在线精品免费 | 污视频在线看网站 | 亚洲精品一区二区三区国产 |