關於Python中的range 物件是不是迭代器的探討
迭代器(iterator)是惰性可迭代物件(lazy iterable),range 函數在 Python 3 中是一個惰性的可迭代對象,那麼 range 是不是迭代器呢?為什麼。
TLNR:Python 3 中的 range 物件(Python 2 中的 xrange 物件)是 lazy 的,但 range 物件不是迭代器。
#是的,這讓人很困惑
當談論Python 中的迭代器(iterator)和可迭代物件(iterable)時,你很可能會聽到有人重複range 是迭代器的誤解。我認為這是非常嚴重誤解, 如果你認為 range 物件是迭代器,那麼你關於「迭代器是如何運作」的心智模型還不夠清楚。從某種意義上來說,range 和迭代器都是「惰性」的,但它們是以相當不同的方式實現「惰性」的。
什麼是迭代器(iterator)
在Python 中,可迭代物件就是你可以迭代的任何東西,而迭代器就是實際迭代的東西。
Iter-ables are able to be iterated over. Iter-ators are the agents that perform the iteration.
可以使用iter 函數從任何可迭代物件中取得迭代器:
#一旦有了迭代器,可以用它做的唯一的事情就是獲得它的下一個元素:
如果沒有更多的元素了, 則會拋出一個stop iteration exception:
所有的迭代器都是可迭代對象,意思是你可以從一個迭代器中得到一個迭代器,因此你可以遍歷一個迭代器:
#應該指出的是迭代器是有狀態的,在循環遍歷一次迭代器後,如果嘗試再次循環,它將為空:
在Python 3 中,<span style="color: rgb(103, 103, 103);">enumerate、zip、reversed</span>
#和其他一些內建函數會傳回迭代器:
#產生器(無論來自生成器函數還是生成器表達式)是一種建立迭代器的簡單方法:
我常說迭代器是惰性的一次性可迭代物件。 「惰性」是因為他們只循環計算項目,「單次使用是因為一旦從一個迭代器中「消費」了一個元素之後,這個元素就永遠消失了。
什麼是range
Python 3 中的range 物件(Python 2 中的xrange)可以像任何其他可迭代物件一樣循環使用:
因為range 是可迭代對象,所以可以從中得到一個迭代器:
#但range 物件本身不是迭代器,我們不能在range 物件上調用next:
與迭代器不同的是,我們可以遍歷一個range 物件而不「消耗」它:
如果我們使用迭代器完成此操作,則第二次循環時不會得到任何元素:
宗上,與 <span style="color: rgb(103, 103, 103);">#zip</span>
##, enumerate<span style="color: rgb(103, 103, 103);"></span>
, or #generator<span style="color: rgb(103, 103, 103);"></span>
物件不同,range 物件不是迭代器。
那麼,究竟range 是什麼
range 物件在某種意義上是「惰性的」,因為它不會產生創建時包含的每個數字,相反,當我們在循環中需要的時候,它才會將這些數字返回給我們。
下面是一個range 物件和一個生成器(是一種迭代器):
不像生成器,range 物件有長度:
且可以被索引:
與迭代器不同,你可以問他們是否包含某個元素而不改變他們的狀態:
如果你想要一個range 物件的描述,可以稱它們為<span style="color: rgb(103, 103, 103);">懶序列</span>
#,range 是序列(如列表,元組和字串),但不包含任何記憶體中的內容,而是透過計算來回答問題。
#為什麼這個差異很重要
如果我告訴你某個物件是一個迭代器,你會知道當在這個物件上呼叫iter 函數時,總是會得到相同的物件(依照定義):
確信可以在這個物件上呼叫next 函數,因為可以在所有的迭代器上呼叫next 函數:
而且你會知道,當遍歷它時,這些元素將從迭代器中被消耗掉,有時候這個特性可以派上用場(以特殊的方式處理迭代器):
#所以雖然看起來「惰性可迭代物件」和“迭代器」之間的差異很微妙,但這些術語確實意味著不同的東西。 雖然「惰性可迭代物件」是一個沒有具體含義的非常普遍的術語,但「迭代器」這個詞意味著一個具有非常特定行為的物件。
總結
如果你知道你可以循環遍歷某個對象,這是一個可迭代對象(iterable )。
如果你知道你正在循環遍歷的物件是在循環的時候計算出來,那麼這是一個惰性可迭代物件(lazy iterable)。
如果你知道你可以傳遞一些東西給 next 函數,它就是一個迭代器(這是最常見的惰性可迭代物件)。
如果你可以循環多次而不用「耗盡」它,它不是迭代器。如果你不能將某些東西傳遞給 next 函數,那麼它不是一個迭代器。 Python 3 的 range 物件不是迭代器。 如果你正在指導別人關於range 物件的知識,請不要使用「迭代器」一詞,這會讓人十分困惑,並可能導致他人開始濫用「迭代器」這個詞
相關推薦:
以上是關於Python中的range 物件是不是迭代器的探討的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

HadiDB:輕量級、高水平可擴展的Python數據庫HadiDB(hadidb)是一個用Python編寫的輕量級數據庫,具備高度水平的可擴展性。安裝HadiDB使用pip安裝:pipinstallhadidb用戶管理創建用戶:createuser()方法創建一個新用戶。 authentication()方法驗證用戶身份。 fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

作為數據專業人員,您需要處理來自各種來源的大量數據。這可能會給數據管理和分析帶來挑戰。幸運的是,兩項 AWS 服務可以提供幫助:AWS Glue 和 Amazon Athena。

啟動 Redis 服務器的步驟包括:根據操作系統安裝 Redis。通過 redis-server(Linux/macOS)或 redis-server.exe(Windows)啟動 Redis 服務。使用 redis-cli ping(Linux/macOS)或 redis-cli.exe ping(Windows)命令檢查服務狀態。使用 Redis 客戶端,如 redis-cli、Python 或 Node.js,訪問服務器。

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。
