最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年08月12日 10:36:16   作者:zhusongziye  
這篇文章主要給大家介紹了關(guān)于Python中可迭代對(duì)象、迭代器和生成器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

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

序列可以迭代的原因: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方法的例子:


輸出結(jié)果:

我們創(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)中。

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

可見,和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類。

哦了!就這么簡(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)化:

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

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

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

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

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

(2)什么是迭代器? 迭代器是這樣的對(duì)象:實(shí)現(xiàn)了無參數(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)潔句法,這樣無需先定義函數(shù)再調(diào)用。

總結(jié)

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

相關(guān)文章

  • Python操作word文檔插入圖片和表格的實(shí)例演示

    Python操作word文檔插入圖片和表格的實(shí)例演示

    這篇文章主要給大家介紹了關(guān)于Python操作word文檔插入圖片和表格的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • python中_del_還原數(shù)據(jù)的方法

    python中_del_還原數(shù)據(jù)的方法

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python中_del_還原數(shù)據(jù)的方法,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Python tkinter實(shí)現(xiàn)桌面軟件流程詳解

    Python tkinter實(shí)現(xiàn)桌面軟件流程詳解

    這篇文章主要介紹了Python tkinter做一個(gè)好用的桌面軟件,100%你會(huì)愛上它,文中的示例代碼講解詳細(xì),快跟小編一起動(dòng)手試一試吧
    2022-10-10
  • pycharm導(dǎo)入第三方庫(kù)的兩種方法(永不報(bào)錯(cuò))

    pycharm導(dǎo)入第三方庫(kù)的兩種方法(永不報(bào)錯(cuò))

    這篇文章主要介紹了pycharm導(dǎo)入第三方庫(kù)的兩種方法(永不報(bào)錯(cuò)),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • Python數(shù)據(jù)可視化之繪制柱狀圖和條形圖

    Python數(shù)據(jù)可視化之繪制柱狀圖和條形圖

    今天帶大家學(xué)習(xí)怎么利用Python繪制柱狀圖,條形圖,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • 詳解Python開啟線程和線程池的方法

    詳解Python開啟線程和線程池的方法

    這篇文章主要介紹了Python開啟線程和線程池的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-03-03
  • python添加列表元素append(),extend()及?insert()

    python添加列表元素append(),extend()及?insert()

    這篇文章主要介紹了python添加列表元素append(),extend()及?insert(),列表是儲(chǔ)存元素的數(shù)據(jù)類型,既然能存儲(chǔ)元素,那么就類似數(shù)據(jù)庫(kù)一樣,增刪改查的一些功能就不能少了。下面我們就來先看看添加列表元素方法有哪些,需要的朋友可以參考一下
    2022-03-03
  • Django實(shí)現(xiàn)文件上傳和下載功能

    Django實(shí)現(xiàn)文件上傳和下載功能

    這篇文章主要為大家詳細(xì)介紹了Django下完成文件上傳和下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)

    使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)

    今天小編就為大家分享一篇關(guān)于使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 強(qiáng)烈推薦好用的python庫(kù)合集(全面總結(jié))

    強(qiáng)烈推薦好用的python庫(kù)合集(全面總結(jié))

    這篇文章主要為大家介紹了強(qiáng)烈推薦非常好用的python庫(kù)合集(全面總結(jié)),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論

浏阳市| 习水县| 宁蒗| 克什克腾旗| 定边县| 呼图壁县| 普兰县| 德令哈市| 丰台区| 西林县| 抚远县| 田东县| 康乐县| 珲春市| 太保市| 尉犁县| 城口县| 铜梁县| 芦山县| 屯门区| 兴安县| 新巴尔虎右旗| 广昌县| 富蕴县| 佛冈县| 莲花县| 玉门市| 滕州市| 扬州市| 平果县| 合川市| 南康市| 苍梧县| 利川市| 高密市| 五指山市| 西乌| 内丘县| 内黄县| 泰兴市| 开鲁县|