當前位置:
首頁 > 知識 > 揭秘 Python 中的 enumerate 函數

揭秘 Python 中的 enumerate 函數

譯者:Vimiix

作者:Dan Bader

譯文:http://vimiix.com/post/2017/12/13/Pythons-enumerate-Function-Demystified/

如何以去寫以及為什麼你應該使用Python中的內置枚舉函數來編寫更乾淨更加Pythonic的循環語句?

Python的 函數是一個神話般的存在,以至於它很難用一句話去總結它的目的和用處。

但是,它是一個非常有用的函數,許多初學者,甚至中級Pythonistas是並沒有真正意識到。簡單來說, 是用來遍歷一個可迭代容器中的元素,同時通過一個計數器變數記錄當前元素所對應的索引值。

讓我們來看一個示例:

這段代碼會輸入如下內容:

正如你所看到的,這個循環遍歷了 列表的所有元素,並通過增加從零開始的計數器變數來為每個元素生成索引。

[如果您想知道上面例子中使用的f"..."字元串語法,這是Python 3.6及更高版本中提供的一種新的字元串格式化技巧。]

用 讓你的循環更加Pythonic

那麼為什麼用 函數去保存運行中的索引很有用呢?

我發現,有很多從C或Java背景轉過來的新的Python開發人員有時使用下面這種 方法來保存運行中每個元素的索引,同時再用 循環遍歷列表:

通過巧妙地使用 函數,就像我在上面的"names"例子中寫的那樣,你可以使你的循環結構看起來更Pythonic和地道。

你不再需要在Python代碼中專門去生成元素索引,而是將所有這些工作都交給 函數處理即可。這樣,你的代碼將更容易被閱讀,而且減少寫錯代碼的影響。(譯者註:寫的代碼越多,出錯幾率越高,盡量將自己的代碼看起來簡潔,易讀,Pythonic,才是我們的追求)


修改起始索引

另一個有用的特性是, 函數允許我們為循環自定義起始索引值。 函數中接受一個可選參數,該參數允許你為本次循環中的計數器變數設置初始值:

在上面的例子中,我將函數調用改為 ,後面的參數1就是本次循環的起始索引,替換默認的0:

OK,這段代碼演示的就是如何將Python的 函數默認0起始索引值修改為1(或者其他任何整形值,根據需求去設置不同值)


背後是如何工作的

你可能想知道 函數背後是如何工作的。事實上他的部分魔法是通過Python迭代器來實現的。意思就是每個元素的索引是懶載入的(一個接一個,用的時候生成),這使得內存使用量很低並且保持這個結構運行很快。

讓我們演示一些更多的代碼來表達我的意思:

在上面這個代碼片段中,正如你所見,我使用了和前面一樣的示例代碼。但是,調用 函數並不會立即返回循環的結果,而只是在控制台中返回了一個 對象。

正如你所看到的,這是一個"枚舉對象"。它的確是一個迭代器。就像我說的,它會在循環請求時懶載入地輸出每個元素。

為了驗證,我們可以取出那些"懶載入"的元素,我計劃在這個迭代器上調用Python的內置函數

對於輸入 中的每個 迭代器元素,迭代器會返回一個形式為 的元組作為list的元素。在典型的for-in循環中,你可以利用Python的數據結構解包功能來充分利用這一點特性:


總結:Python中的enumerate函數 - 關鍵點

是Python的一個內置函數。你應該充分利用它通過循環迭代自動生成的索引變數。

索引值默認從0開始,但也可以將其設置為任何整數。

函數是從2.3版本開始被添加到Python中的,詳情見PEP279。

Python的函數可以幫助你編寫出更加Pythonic和地道的循環結構,避免使用笨重且容易出錯的手動生成索引。

為了充分利用的特性,一定要研究Python的迭代器和數據結構解包功能。

題圖:pexels,CC0 授權。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 編程派 的精彩文章:

12步輕鬆搞定Python裝飾器
數據工程師推薦你用的幾個工具

TAG:編程派 |