Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
你應該在何時何地,如何使用內置的 enumerate() 函數來寫出更加簡潔、更加具有 Python 範兒的循環結構呢?
Python 的 enumerate() 函數就像是一個神秘的黑箱,你無法簡單地用一句話來概括這個函數的作用與用法。
enumerate() 函數屬於非常有用的高級用法,而對於這一點,很多初學者甚至中級學者都沒有意識到。這個函數的基本應用就是用來遍歷一個集合對象,它在遍歷的同時還可以得到當前元素的索引位置。
我們看一個例子:
上面代碼的輸出結果為
正如你所看到的那樣,它對這個列表進行迭代,從零開始依次增加,產生每個元素的索引。
enumerate 使你的代碼更具 Python 範兒
為什麼使用 enumerate() 函數來產生元素的索引是很有用的呢?
我注意到那些從 C 或者 Java 轉到 Python 的新用戶在對一個列表進行 for 循環的時候會使用 range(len(---)) 這樣的語句來追蹤元素的索引。
正如我最上面舉的那個例子,通過使用 enumerate() 函數可以使你的代碼更加地道,更加具有 Python 範兒。
在 Python 中我們通常沒有必要手動的生成元素的索引,完全可以將這種簡單的任務扔給 enumerate() 函數。這樣一來既提高了你的代碼可讀性,也減少了拼寫錯誤的可能。
改變初始索引值
enumerate() 函數的另一個有用的特性就是它可以改變初始的索引值。 此函數接受一個可選擇的預設參數,這個參數可以用來設置索引計數器的初始值。
在上面的例子中,我簡單的更改了函數的調用方法 enumeate(names, 1) 後面的這個參數 1 ,這樣一來,我們索引的初始值便是 1 而不是 0。
以上過程就是如何使用 enumerate() 函數將來從 0 轉換為從 1 索引(其他的整數都行)。
enumerate 函數的運行機制
你也許會好奇 enumerate() 函數背後運行的機制是什麼。其一部分原理是 enumerate() 函數是作為 Python 的迭代器實現的。這就意味著元素索引的產生是按照時間序列一個一個產生(就像生成器),這也是這個函數在內存消耗小的情況下可以快速運行的原因。
我們用代碼來展示一下其中的原理:
在上面的代碼片段中,就像之前的例子一樣,我創建了一個相同的枚舉對象。但是我並沒有直接使用循環去調用它,而是將它在控制臺列印輸出。
正如你看到的,它是一個枚舉對象,其實也就是一個迭代器。就像我之前說的那樣,當我需要的時候,它可以將結果一個一個地產生出來。
為了檢查這些按需產生的元素,我們需要將其顯示出來。在這裡我對這個迭代器使用了內置函數 list。
對於list(name) 中的每個元素,通過 enumerate() 迭代器返回之後的可以得到一個元組形式的元素(index, element)。 在 for 循環中,你可以利用 Python 的數據結構解包功能來使用返回的結果,如下所示:
Python 的 enumerate 函數的關鍵點
1. enumerate() 函數是 Python 的內置函數。你可以在 for 循環中使用它,它可以自動產生可迭代對象中的元素索引。
2. 默認情況下索引計數器從零開始,但是你可以將其設置為任意的整數。
3. enumerate() 函數自 Python 2.3 開始便已添加,可以在 PEP 279 中看到它的用法。
4. enumerate() 函數可以幫我們寫出更加地道的、更加具有 Python 範兒的循環結構,從而避免那些笨拙且易錯的手動索引。
5. 為了更加詳細的了解 enumerate() 函數,強烈建議你學習一下 python 的迭代器與數據結構解包。
英文原文:https://dbader.org/blog/python-enumerate校友同行內推公眾號 IR-job
國內最大的網際網路、通信、電子、金融類內部推薦平臺,團隊成員直接收簡歷,一步到位,準確迅速!
工作機會來自於行業頂級的知名公司,職位包括但不限於軟硬體工程師、產品經理、項目經理、銷售、機械等各個方面,機會多多!
關注成員多來自211、985名校,清華東南北理工,兩電一郵中科大!各地精英,共享資源,互推靠譜高薪職位!
掃碼關注,頂級公司,熱門職位,撲面而來!
點擊「閱讀原文」,直接訪問「校友同行內推」。