可迭代對象以及迭代器的說明

来源:https://www.cnblogs.com/kphang/archive/2023/01/05/17026932.html
-Advertisement-
Play Games

可迭代對象通過iter(),轉化為迭代器對象,迭代器可以使用next()訪問,可迭代對象不能直接使用next(); 迭代器是一個可以記住遍歷的位置的對象,所以可以方便的使用next()。 可迭代對象(iterable):凡是具有__iter__的方法的類,都是可迭代的類。可迭代類創建的對象實現了__ ...


可迭代對象通過iter(),轉化為迭代器對象,迭代器可以使用next()訪問,可迭代對象不能直接使用next();

  • 迭代器是一個可以記住遍歷的位置的對象,所以可以方便的使用next()。

可迭代對象(iterable):凡是具有__iter__的方法的類,都是可迭代的類。可迭代類創建的對象實現了__iter__方法,因此就是可迭代對象。用list、tuple等容器創建的對象,都是可迭代對象。下麵兩個例子:

Eg1:

my_list = [1, 2, 3] 

for item in my_list: # 可迭代對象
    print(item)  # 輸出:1 2 3

Eg2

for i, item in enumerate([1, 2, 3]): # 迭代器對象
    print(f'index: {i}, item: {item}')
  • enumerate()是一個內置函數,它可以同時遍歷一個列表的索引和元素。這個函數接受一個可迭代對象作為參數,並返回一個迭代器,該迭代器每次返回一對(索引,元素)。

這裡就產生了一個疑問?為什麼Eg1 for遍歷的是一個iterable,Eg2 for遍歷的是一個iterator

解答:for迴圈的工作機制

  • 當對象本身就是迭代器時,For迴圈工作機制;
    • 調用 __iter__方法,返回自身self,也就是返回迭代器;
    • 不斷地調用迭代器的next()方法,每次按序返回迭代器中的一個值;
    • 迭代到最後沒有元素時,就拋出異常 StopIteration,這個異常 python 自己會處理,不會暴露給開發者;
  • 在可迭代對象中,for迴圈工作機制;
    • 先判斷對象是否為可迭代對象(等價於判斷有沒有__iter__或__getitem__方法),沒有的話直接報錯,拋出TypeError異常。有的話,調用 __iter__方法,返回一個迭代器。
    • 在python內部不斷地調用迭代器的__next__方法,每次按序返回迭代器中的一個值;
    • 迭代到最後沒有元素時,就拋出異常 StopIteration,這個異常 python 自己會處理,不會暴露給開發者。

總結:

For迴圈深層還是對迭代器進行遍歷,只不過會自動的可迭代對象轉換為迭代器。

參考目錄:

Python中的可迭代對象、迭代器、For迴圈工作機制、生成器 - 個人文章 - SegmentFault 思否

Python3 迭代器與生成器 | 菜鳥教程 (runoob.com)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 小學妹說要畢業了,學了一學期Python等於沒學,現在要做畢設做不出來,讓我幫幫她,晚上去她家吃夜宵。 當時我心想,這不是分分鐘的事情,還要去她家,男孩子晚上不要隨便出門,要學會保護好自己,於是我花了十分鐘給她寫了一個發過去,這下不用去她家了~ 代碼實戰 主要代碼,完整代碼素材、包括其它版本學生管理 ...
  • JZ84 二叉樹中和為某一值的路徑(三) 題目 給定一個二叉樹root和一個整數值 sum ,求該樹有多少路徑的的節點值之和等於 sum 。 1.該題路徑定義不需要從根節點開始,也不需要在葉子節點結束,但是一定是從父親節點往下到孩子節點 2.總節點數目為n 3.保證最後返回的路徑個數在整形範圍內(即 ...
  • 引言 spring實現的bean自動註入在項目開發中是一個經常使用到的功能,但自動裝配兩個或多個bean時,會拋出NoUniqueBeanDefinitionException:No qualifying bean of type 'com' available: expected single m ...
  • RESTfulL是一種網路應用程式的設計風格和開發方式,即介面請求方式和路徑的一種風格。 普通風格: localhost:8080/add?a=1&b=2 RestFul風格: localhost:8080/add/1/2 GET 獲取: localhost:8080/item/1 POST 新增: ...
  • 1、粘包與半包 啥也不說了,直接上代碼是不是有點不太友好,我所謂了,都快過年了,還要啥自行車 我上來就是一段代碼猛如虎 1.1 伺服器代碼 public class StudyServer { static final Logger log = LoggerFactory.getLogger(Stu ...
  • 我的客服系統有一些介面是專門給內部調用的,只允許其他內部系統來調用,不允許隨意訪問,可以使用IP白名單機制 使用 Gin 框架實現 IP 白名單機制可以使用中間件的方式實現。你可以編寫一個中間件函數,在每個請求到來時檢查它的 IP 地址是否在白名單中,如果不在,則返回錯誤信息。 例如,你可以這樣編寫 ...
  • JetBrains Clion 是一款專為 C/C++ 開發所設計的跨平臺 IDE。本文適用 JetBrains CLion v2019.3/3.1/3.2/3.3 永久激活,附破解補丁和激活碼,可以永久激活 Windows、MAC、Linux 下的 CLion!!!網上有激活碼的激活方式(更改 h ...
  • go build 命令好處 我開發了一套線上客服系統源碼,使用了go build進行編譯 在我的線上客服系統使用 go build 命令的主要好處是,它可以將 Go 程式編譯成可執行文件,這樣就可以將程式部署到生產環境中。 在生產環境中運行的程式通常是編譯後的可執行文件,因為這樣可以提高程式的執行效 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...