<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網

      掃一掃關注

      當前位置: 首頁 » 企業資訊 » 經驗 » 正文

      Python_中的迭代器實現原理是什么?

      放大字體  縮小字體 發布日期:2023-03-10 11:48:36    作者:葉麓菲    瀏覽次數:79
      導讀

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

      本文首發自「慕課網」,想了解更多IT干貨內容,程序員圈內熱聞,歡迎關注!

      作者| 慕課網精英講師 朱廣蔚

      在數學中,集合表示由一個或多個確定的元素所構成的整體。在 Python 中,列表、元組、集合可以用于表示數學中的集合。

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

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

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

    • 遍歷列表的代碼

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

    • 遍歷元組的代碼

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

    • 遍歷集合的代碼

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

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

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

    • 在第 1 行,使用列表表示 strings
    • 在第 3 行,通過 len(strings) 獲取列表 strings 中字符串的數量
    • 在第 4 行,通過 strings[i] 訪問第 i 個元素

      以上的遍歷方式中,要求 strings 是一個列表,如果 strings 的數據結構發生變化:使用集合而不是列表表示 strings,那么通過訪問索引的方式進行遍歷的代碼就會失效。

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

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

      因為 strings 是一個集合,不支持索引操作,會導致運行錯誤:

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

      應盡可能使用 for … in 循環遍歷可迭代對象,如果可迭代對象的數據類型發生變化,從列表變成集合,使用for … in 循環遍歷的代碼則無需改變。

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

      迭代器 iterator 是一個特殊的對象,用于遍歷訪問可迭代對象 iterable。Python 通過迭代器 iterator 實現 for … in 循環語句,用戶編寫的 for … in 循環代碼如下:

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

      這段 for … in 循環代碼會被翻譯為如下:

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

    • 在第 1 行,內置函數 iter 獲取可迭代對象 iterable 的迭代器 iterator
    • 在第 4 行,內置函數 next 獲取迭代器 iterator 返回的下一個元素
    • 在第 6 行,當迭代器遍歷完全部元素后,拋出一個特殊的異常 StopIteration,表示迭代結束1.2 列表的迭代器

      下面通過一個具體的例子,了解如何通過迭代器實現 for … in 循環,使用 for … in 循環遍歷列表的代碼如下:

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

      Python 把以上 for … in 循環轉換為如下功能等價的代碼:

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

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

      wwwimooccom代碼塊1233. 迭代協議

      使用迭代器遍歷訪問可迭代對象,要求迭代器和可迭代對象遵循迭代協議,迭代協議如下:

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

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

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

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

      1. 異常 StopIteration,當遍歷完全部的元素后,成員方法 __next__ 拋出一個特殊的異常 Stop Iteration 表示遍歷結束
      2. 內置函數 iter,用于獲取可迭代對象對應的迭代器

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

    • 在第 1 行,iter 的輸入參數是可迭代對象 iterable
    • 在第 2 行,調用成員方法 __iter__
    • 在第 3 行,返回迭代器 iterator
      1. 內置函數 next,用于獲取下一個被遍歷的元素

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

    • 在第 1 行,next 的輸入參數是迭代器 iterator
    • 在第 2 行,調用成員方法 __next__
    • 在第 3 行,返回被遍歷的元素

      根據以上的迭代協議,即可將 for … in 循環翻譯為如下等價代碼:

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

      通過單鏈表實現堆棧,圖示如下:

      通過單鏈表實現堆棧

      在上圖中,每個節點有兩個字段: item 和 next,item 用于存儲數據,next 指向下一個節點,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

    • 在第 1 行,定義了類 Node 用于描述鏈表中的節點
    • 在第 6 行,定義了類 Stack 描述堆棧在第 8 行,定義了頭指針 head,指向鏈表中的首個節點在第 10 行,定義了成員方法 push,將元素壓如到堆棧中在第 11 行,創建一個新節點 node在第 12 行,新節點 node 的 next 指向頭結點在第 13 行,頭結點指向新節點
    • 在第 15 行,創建一個對象 stack
    • 在第 16 行到第 18 行,依次壓入 3 個元素 ‘a’、‘b’、‘c’4.2 實現迭代協議

      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

    • 在第 1 行,定義類 StackIterator類 Stack 是可迭代對象類 StackIterator 是迭代器
    • 在第 2 行,定義構造函數,參數 stack 是被遍歷的對象在第 4 行,成員變量 cursor 指向了當前正在遍歷的元素,初始化被設置為鏈表的頭結點
    • 在第 6 行,定義方法 __next__在第 7 行,如果變量 cursor 等于 None,表示已經到達鏈表的尾部,即遍歷完全部的元素了在第 8 行,拋出異常 StopIteration 表示遍歷結束在第 9 行,如果變量 cursor 不等于 None在第 10 行,記錄下當前正在遍歷的元素在第 11 行,將 cursor 指向下一個元素

      在定義了 StackIterator 后,在 Stack 中增加一個新的成員方法 __iter__,返回 Stack 對應的迭代器,代碼如下:

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

      在實現了迭代協議后,使用 while 循環顯示的使用 iter、next、StopIteration 完成對 stack 的遍歷,代碼如下:

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

      程序依次壓入 ‘a’、‘b’、‘c’,遍歷時以壓入相反的順序輸出,結果如下:

      cba代碼塊1234.4 通過 for … in 循環遍歷堆棧

      在實現了迭代協議后,可以通過 for … in 循環進行遍歷,代碼如下:

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

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

      cba代碼塊123

      歡迎關注「慕課網」,發現更多IT圈優質內容,分享干貨知識,幫助你成為更好的程序員!

    •  
      (文/葉麓菲)
      免責聲明
      本文僅代表作發布者:葉麓菲個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
       

      Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

      粵ICP備16078936號

      微信

      關注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯系
      客服

      聯系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號: weishitui

      客服001 客服002 客服003

      工作時間:

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

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 久久99精品国产99久久6男男 | 和武警第一次做男男gay| 亚洲av专区无码观看精品天堂 | 国产三级在线观看完整版| 久久精品视频网站| 国产99在线|亚洲| 最近中文字幕更新8| 手机福利视频一区二区| 国产一级一级一级国产片| 亚洲国产成人av网站| 一边摸下面一别吃奶| 美国omakmanta| 日韩欧美一区二区三区| 国产美女91视频| 亚洲日韩亚洲另类激情文学| 91麻豆国产级在线| 欧美日韩精品久久久久| 国产精品亚洲а∨无码播放麻豆| 亚洲午夜久久久影院伊人| 亚洲人成网站看在线播放| 欧美黑人巨大videos精品| 国产精品无码素人福利免费| 亚洲国产成人久久笫一页| 亚洲色图欧美激情| 日韩欧美国产三级| 国产一区二区三区日韩欧美| 两个人看的www免费视频| 男女午夜性爽快免费视频不卡| 在线视频网站WWW色| 亚洲欧美一区二区三区| 亚洲香蕉久久一区二区 | 麻豆福利在线观看| 欧美影院一区二区| 天堂资源在线www中文| 午夜dj在线观看免费高清在线 | 两个人一上一下剧烈运动| 男人桶女人的肌肌30分| 国产美女一级视频| 乱色美www女麻豆| 翁止熄痒禁伦短文合集免费视频| 女人与狥交下配a级正在播放|