黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

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

系統 2117 0

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

序列可以迭代的原因:iter 函數。解釋器需要迭代對象 x 時,會自動調用 iter(x)。內置的 iter 函數有以下作用:

(1) 檢查對象是否實現了 iter 方法,如果實現了就調用它,獲取一個迭代器。

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

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

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

下面看一個實現了getitem方法的例子:

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

輸出結果:

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

我們創建了一個類Eg1,并且為這個類實現了 getitem 方法, 它的實例化對象o1 就是可迭代對象。

下面我們看一個實現 iter 方法的例子,因為用到了迭代器,所以在此我們必須在明確一下迭代器的用法。 標準的迭代器接口有兩個方法:

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

返回 self,以便在應該使用可迭代對象的地方使用迭代器,例如在 for 循環中。

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

我們創建了Eg2類,并為它實現了 iter 方法,此方法返回一個迭代器Eg2Iterator。 Eg2Iterator 實現了我們之前所說的next和iter方法。 實例化對象,并循環輸出:

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

可見,和o1是一樣的。

我們通過兩種方法實現了一個自己的可迭代對象,再此過程中我們要明確可迭代的對象和迭代器之間的關系:

Python 從可迭代的對象中獲取迭代器。

iter方法從我們自己創建的迭代器類中獲取迭代器,而getitem方法是python內部自動創建迭代器。

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

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

哦了!就這么簡單優雅!不用再單獨定義一個迭代器類!

這里我們使用了yield 關鍵字, 只要 Python 函數的定義體中有 yield 關鍵字,該函數就是生成器函數。調用生成器函數時,會返回一個生成器對象。也就是說,生成器函數是生成器工廠。 當然,例子3的代碼還可以使用yield from進一步簡化:

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

到這里我們明白了 可迭代對象 和 迭代器,還引申出了生成器,但還有一點沒有提,那就是生成器表達式。

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

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

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

最后,總結一下:

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

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

(3)什么是生成器? 生成器是帶有 yield 關鍵字的函數。調用生成器函數時,會返回一個生成器對象。

(4)什么是生成器表達式? 生成器表達式是創建生成器的簡潔句法,這樣無需先定義函數再調用。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論