二維碼
        企資網(wǎng)

        掃一掃關(guān)注

        當(dāng)前位置: 首頁(yè) » 企資頭條 » 熱點(diǎn) » 正文

        Python_中的迭代器實(shí)現(xiàn)原理是什么?

        放大字體  縮小字體 發(fā)布日期:2023-03-10 11:48:36    作者:葉麓菲    瀏覽次數(shù):56
        導(dǎo)讀

        本文首發(fā)自「慕課網(wǎng)」,想了解更多IT干貨內(nèi)容,程序員圈內(nèi)熱聞,歡迎關(guān)注!作者| 慕課網(wǎng)精英講師 朱廣蔚在數(shù)學(xué)中,集合表示由一個(gè)或多個(gè)確定的元素所構(gòu)成的整體。在 Python 中,列表、元組、集合可以用于表示數(shù)學(xué)中

        本文首發(fā)自「慕課網(wǎng)」,想了解更多IT干貨內(nèi)容,程序員圈內(nèi)熱聞,歡迎關(guān)注!

        作者| 慕課網(wǎng)精英講師 朱廣蔚

        在數(shù)學(xué)中,集合表示由一個(gè)或多個(gè)確定的元素所構(gòu)成的整體。在 Python 中,列表、元組、集合可以用于表示數(shù)學(xué)中的集合。

        例如,分別使用列表、元組、集合表示了一個(gè)包含 3 個(gè)字符串的集合:

      1. 列表 [‘www’, ‘imooc’, ‘com’]
      2. 元組 (‘www’, ‘imooc’, ‘com’)
      3. 集合 {‘www’, ‘imooc’, ‘com’}1. 可迭代對(duì)象 iterable1.1 什么是可迭代對(duì)象

        Python 提供了 for … in 循環(huán),用于對(duì)列表、元組、集合中的元素進(jìn)行遍歷。能夠被 for … in 循環(huán)遍歷的對(duì)象被稱為可迭代對(duì)象 iterable,列表、元組、集合均屬于可迭代對(duì)象。使用 for … in 循環(huán)遍歷可迭代對(duì)象的例子如下:

      4. 遍歷列表的代碼

        list = ['www', 'imooc', 'com']for item in list: print(item)代碼塊123

      5. 遍歷元組的代碼

        tuple = ('www', 'imooc', 'com')for item in tuple: print(item)代碼塊123

      6. 遍歷集合的代碼

        set = {'www', 'imooc', 'com'}for item in set: print(item)代碼塊1231.2 盡可能使用 for … in 循環(huán)進(jìn)行遍歷

        如果需要遍歷的對(duì)象是列表,可以通過訪問索引的方式進(jìn)行遍歷,代碼如下:

        strings = ['www', 'imooc', 'com']i = 0while i < len(strings): string = strings[i] print(string) i = i + 1代碼塊123456

      7. 在第 1 行,使用列表表示 strings
      8. 在第 3 行,通過 len(strings) 獲取列表 strings 中字符串的數(shù)量
      9. 在第 4 行,通過 strings[i] 訪問第 i 個(gè)元素

        以上的遍歷方式中,要求 strings 是一個(gè)列表,如果 strings 的數(shù)據(jù)結(jié)構(gòu)發(fā)生變化:使用集合而不是列表表示 strings,那么通過訪問索引的方式進(jìn)行遍歷的代碼就會(huì)失效。

        strings = {'www', 'imooc', 'com'}i = 0while i < len(strings): string = strings[i] print(string) i = i + 1代碼塊123456

      10. 在第 1 行,使用集合表示 strings
      11. 在第 3 行,通過 len(strings) 獲取集合 strings 中字符串的數(shù)量
      12. 在第 4 行,通過 strings[i] 訪問第 i 個(gè)元素

        因?yàn)?strings 是一個(gè)集合,不支持索引操作,會(huì)導(dǎo)致運(yùn)行錯(cuò)誤:

        Traceback (most recent call last): File "strings.py", line 5, in <module> string = strings[i]TypeError: 'set' object does not support indexing代碼塊1234

        應(yīng)盡可能使用 for … in 循環(huán)遍歷可迭代對(duì)象,如果可迭代對(duì)象的數(shù)據(jù)類型發(fā)生變化,從列表變成集合,使用for … in 循環(huán)遍歷的代碼則無需改變。

        2. 迭代器 iterator1.1 什么是迭代器

        迭代器 iterator 是一個(gè)特殊的對(duì)象,用于遍歷訪問可迭代對(duì)象 iterable。Python 通過迭代器 iterator 實(shí)現(xiàn) for … in 循環(huán)語(yǔ)句,用戶編寫的 for … in 循環(huán)代碼如下:

        for item in iterable: print(item)代碼塊12

        這段 for … in 循環(huán)代碼會(huì)被翻譯為如下:

        iterator = iter(iterable)while True: try: item = next(iterator) print(item) except StopIteration: break代碼塊1234567

      13. 在第 1 行,內(nèi)置函數(shù) iter 獲取可迭代對(duì)象 iterable 的迭代器 iterator
      14. 在第 4 行,內(nèi)置函數(shù) next 獲取迭代器 iterator 返回的下一個(gè)元素
      15. 在第 6 行,當(dāng)?shù)鞅闅v完全部元素后,拋出一個(gè)特殊的異常 StopIteration,表示迭代結(jié)束1.2 列表的迭代器

        下面通過一個(gè)具體的例子,了解如何通過迭代器實(shí)現(xiàn) for … in 循環(huán),使用 for … in 循環(huán)遍歷列表的代碼如下:

        list = ['www', 'imooc', 'com']for item in list: print(item)代碼塊123

        Python 把以上 for … in 循環(huán)轉(zhuǎn)換為如下功能等價(jià)的代碼:

        list = ['www', 'imooc', 'com']listIterator = iter(list)while True: try: item = next(listIterator) print(item) except StopIteration: break代碼塊12345678

        以上兩段代碼均輸出相同的結(jié)果,如下所示:

        wwwimooccom代碼塊1233. 迭代協(xié)議

        使用迭代器遍歷訪問可迭代對(duì)象,要求迭代器和可迭代對(duì)象遵循迭代協(xié)議,迭代協(xié)議如下:

        1. 可迭代對(duì)象 iterable 提供成員方法 __iter__,該方法返回用于遍歷的迭代器 iterator

        class Iterable: def __iter__(self):代碼塊12

        1. 迭代器 iterator 提供成員方法 __next__,該方法返回下一個(gè)被遍歷的元素

        class Iterator: def __next__(self):代碼塊12

        1. 異常 StopIteration,當(dāng)遍歷完全部的元素后,成員方法 __next__ 拋出一個(gè)特殊的異常 Stop Iteration 表示遍歷結(jié)束
        2. 內(nèi)置函數(shù) iter,用于獲取可迭代對(duì)象對(duì)應(yīng)的迭代器

        def iter(iterable): iterator = iterable.__iter__() return iterator代碼塊123

      16. 在第 1 行,iter 的輸入?yún)?shù)是可迭代對(duì)象 iterable
      17. 在第 2 行,調(diào)用成員方法 __iter__
      18. 在第 3 行,返回迭代器 iterator
        1. 內(nèi)置函數(shù) next,用于獲取下一個(gè)被遍歷的元素

        def next(iterator): item = iterator.__next__() return item代碼塊123

      19. 在第 1 行,next 的輸入?yún)?shù)是迭代器 iterator
      20. 在第 2 行,調(diào)用成員方法 __next__
      21. 在第 3 行,返回被遍歷的元素

        根據(jù)以上的迭代協(xié)議,即可將 for … in 循環(huán)翻譯為如下等價(jià)代碼:

        iterator = iter(iterable)while True: try: item = next(iterator) print(item) except StopIteration: break代碼塊12345674. 實(shí)現(xiàn)一個(gè)自定義的迭代器4.1 通過單鏈表實(shí)現(xiàn)堆棧

        通過單鏈表實(shí)現(xiàn)堆棧,圖示如下:

        通過單鏈表實(shí)現(xiàn)堆棧

        在上圖中,每個(gè)節(jié)點(diǎn)有兩個(gè)字段: item 和 next,item 用于存儲(chǔ)數(shù)據(jù),next 指向下一個(gè)節(jié)點(diǎn),head 指針指向堆棧的頂部。描述堆棧的 Python 代碼如下:

        class Node: def __init__(self, item): self.item = item self.next = Noneclass Stack: def __init__(self): self.head = None def push(self, item): node = Node(item) node.next = self.head self.head = nodestack = Stack()stack.push('a')stack.push('b')stack.push('c')代碼塊123456789101112131415161718

      22. 在第 1 行,定義了類 Node 用于描述鏈表中的節(jié)點(diǎn)
      23. 在第 6 行,定義了類 Stack 描述堆棧在第 8 行,定義了頭指針 head,指向鏈表中的首個(gè)節(jié)點(diǎn)在第 10 行,定義了成員方法 push,將元素壓如到堆棧中在第 11 行,創(chuàng)建一個(gè)新節(jié)點(diǎn) node在第 12 行,新節(jié)點(diǎn) node 的 next 指向頭結(jié)點(diǎn)在第 13 行,頭結(jié)點(diǎn)指向新節(jié)點(diǎn)
      24. 在第 15 行,創(chuàng)建一個(gè)對(duì)象 stack
      25. 在第 16 行到第 18 行,依次壓入 3 個(gè)元素 ‘a(chǎn)’、‘b’、‘c’4.2 實(shí)現(xiàn)迭代協(xié)議

        class StackIterator: def __init__(self, stack): self.stack = stack self.cursor = self.stack.head def __next__(self): if self.cursor == None: raise StopIteration else: item = self.cursor.item self.cursor = self.cursor.next return item代碼塊123456789101112

      26. 在第 1 行,定義類 StackIterator類 Stack 是可迭代對(duì)象類 StackIterator 是迭代器
      27. 在第 2 行,定義構(gòu)造函數(shù),參數(shù) stack 是被遍歷的對(duì)象在第 4 行,成員變量 cursor 指向了當(dāng)前正在遍歷的元素,初始化被設(shè)置為鏈表的頭結(jié)點(diǎn)
      28. 在第 6 行,定義方法 __next__在第 7 行,如果變量 cursor 等于 None,表示已經(jīng)到達(dá)鏈表的尾部,即遍歷完全部的元素了在第 8 行,拋出異常 StopIteration 表示遍歷結(jié)束在第 9 行,如果變量 cursor 不等于 None在第 10 行,記錄下當(dāng)前正在遍歷的元素在第 11 行,將 cursor 指向下一個(gè)元素

        在定義了 StackIterator 后,在 Stack 中增加一個(gè)新的成員方法 __iter__,返回 Stack 對(duì)應(yīng)的迭代器,代碼如下:

        class Stack: def __iter__(self): return StackIterator(self) 代碼塊1234.3 通過 while 循環(huán)遍歷堆棧

        在實(shí)現(xiàn)了迭代協(xié)議后,使用 while 循環(huán)顯示的使用 iter、next、StopIteration 完成對(duì) stack 的遍歷,代碼如下:

        stackIterator = iter(stack)while True: try: item = next(stackIterator) print(item) except StopIteration: break代碼塊1234567

        程序依次壓入 ‘a(chǎn)’、‘b’、‘c’,遍歷時(shí)以壓入相反的順序輸出,結(jié)果如下:

        cba代碼塊1234.4 通過 for … in 循環(huán)遍歷堆棧

        在實(shí)現(xiàn)了迭代協(xié)議后,可以通過 for … in 循環(huán)進(jìn)行遍歷,代碼如下:

        for item in stack: print(item)代碼塊12

        與上一節(jié)的代碼相比,代碼要簡(jiǎn)潔很多,程序輸出相同的結(jié)果如下:

        cba代碼塊123

        歡迎關(guān)注「慕課網(wǎng)」,發(fā)現(xiàn)更多IT圈優(yōu)質(zhì)內(nèi)容,分享干貨知識(shí),幫助你成為更好的程序員!

      29.  
        (文/葉麓菲)
        打賞
        免責(zé)聲明
        本文為葉麓菲推薦作品?作者: 葉麓菲。歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明原文出處:http://www.hbruiju.com/news/show-325981.html 。本文僅代表作者個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,作者需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請(qǐng)及時(shí)聯(lián)系我們郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2023 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號(hào)

        粵ICP備16078936號(hào)

        微信

        關(guān)注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯(lián)系
        客服

        聯(lián)系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號(hào): weishitui

        客服001 客服002 客服003

        工作時(shí)間:

        周一至周五: 09:00 - 18:00

        反饋

        用戶
        反饋

        主站蜘蛛池模板: 波多野结衣中文一区| 三上悠亚国产精品一区| 无码av中文一区二区三区桃花岛 | 国产成人一区二区三中文| 乱码人妻一区二区三区| 国产免费播放一区二区| 国产日韩精品一区二区三区| 亚洲视频在线一区二区三区| 2014AV天堂无码一区| 国产成人av一区二区三区在线 | 日韩人妻精品无码一区二区三区 | 久久精品一区二区| 一区国严二区亚洲三区| 国产免费av一区二区三区| 亚洲熟女乱色一区二区三区| 亚洲一区二区影院| 亚洲一区二区三区国产精品| 精品一区二区三区无码视频| 激情无码亚洲一区二区三区| 偷拍激情视频一区二区三区| 无码日韩精品一区二区免费暖暖| 爱爱帝国亚洲一区二区三区 | 一区二区视频传媒有限公司| 日本无卡码免费一区二区三区| 国产在线观看一区精品| 精品少妇一区二区三区在线| 亚洲av片一区二区三区| 国产精品久久久久一区二区| 成人丝袜激情一区二区| 一区二区三区亚洲| 亚洲一区二区三区电影| 色狠狠色噜噜Av天堂一区| 免费看一区二区三区四区| 国产高清视频一区三区| 少妇无码一区二区三区| 国内自拍视频一区二区三区 | 色狠狠AV一区二区三区| 一区国产传媒国产精品| 国产一区二区精品久久91| 亚洲国产精品一区二区九九| 三上悠亚国产精品一区|