詳解 Python 的 enumerate 函數

2021-03-02 Python程式設計師

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名校,清華東南北理工,兩電一郵中科大!各地精英,共享資源,互推靠譜高薪職位!

掃碼關注,頂級公司,熱門職位,撲面而來!

點擊「閱讀原文」,直接訪問「校友同行內推」。

相關焦點

  • 揭秘 Python 中的 enumerate() 函數
    用 enumerate()讓你的循環更加Pythonic那麼為什麼用 enumerate()函數去保存運行中的索引很有用呢? enumerate(names, 1),後面的參數1就是本次循環的起始索引,替換默認的0:OK,這段代碼演示的就是如何將Python的 enumerate()函數默認0起始索引值修改為1(或者其他任何整形值,根據需求去設置不同值)enumerate()背後是如何工作的你可能想知道 enumerate()函數背後是如何工作的。
  • 一文看懂Python列表表達式及高階函數如lamda, zip, enumerate, map和filter方法.
    深入了解和熟練使用python的列表表達式和內置的一些高階函數如lamda, zip, enumerate, map, filter, reduce
  • Python語言中enumerate()及zip()函數的使用例子
    在Python程式語言中,enumerate()及zip()是兩個常用的內置函數,這兩個函數功能類似,但又有所區別,下面通過兩個例子分別進行說明。enumerate()函數該函數在字面上是枚舉、列舉的意思,用於將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中,可同時得到數據對象的值及對應的索引值。
  • python 內置函數
    列舉部分python內置函數描述abs() 函數返回數字的絕對值
  • Python中有哪些內置函數呢?以及內置函數實例
    >Python中有哪些內置函數呢?高級內置函數enumerate 返回一個可以枚舉的對象eval 取出 字符串中的內容,將字符串str當成有效的表達式來求指並返回計算結果exec 執行字符串或complie方法編譯過的字符串
  • Python函數詳解一(函數參數、變量作用域)
    Python函數函數是python程序的重要組成部分。所謂函數就是實現某一特定功能的代碼段,可重複使用,提高了代碼的利用率。
  • Python——實用的enumerate和zip
    enumerate首先介紹的是enumerate函數。在我們日常編程的過程當中,經常會遇到一個問題。在C語言以及一些古老的語言當中是沒有迭代器這個概念的,所以我們要遍歷數組或者是容器的時候,往往只能通過下標。有了迭代器之後,我們遍歷的過程方便了很多,我們可以直接用一個變量去迭代一個容器當中的值。最簡單的例子就是數組的遍歷,比如我們要遍歷items這個數組。
  • python:pop函數詳解 - 二進位01
    pop函數詳解今天我為大家講解python中pop函數的使用。#python#簡介——pop()函數是python解釋器的內置方法,可作用於列表,字典。用法說明——在builtins.py中找到pop函數。列表:L.pop([index]) -> item -- remove and return item at index (default last).
  • Python中enumerate對象的用法與特點
    Python的內置函數enumerate()函數用來枚舉可迭代對象中的元素,返回可迭代的enumerate對象,其中每個元素都是包含索引和值的元組
  • Python 63個內置函數超級詳解
    文章來源:AI入門學習作者:小伍哥python內置了一些非常精巧且強大的函數,對初學者來說,一般不怎麼用到,但是偶爾會碰到,我也是用了一段時間python之後才發現,臥槽,還有這麼好的函數,每個函數都非常經典,而且經過嚴格測試,使用內置函數,不用自己閉門造車,並且代碼簡潔易讀了很多,真是方便又實用,值得花時間進行體系化研究學習。
  • Python中enumerate函數的解釋和可視化
    enumerate() 的作用在許多情況下,我們需要在迭代數據對性(即我們可以循環的任何對象)時獲取元素的索引。我們可以使用enumerate()來實現:for i, j in enumerate(example): print(i, j)enumerate()提供了強大的功能,例如,當您需要獲取索引列表時,它會派上用場:
  • Python內置函數一覽表
    Python 標準庫非常龐大,包含了很多模塊,要想使用某個函數,必須提前導入對應的模塊,否則函數是無效的。內置函數是解釋器的一部分,它隨著解釋器的啟動而生效;標準庫函數是解釋器的外部擴展,導入模塊以後才能生效。一般來說,內置函數的執行效率要高於標準庫函數。
  • python入門基礎之lambda匿名函數詳解
    python入門基礎之lambda匿名函數詳解剛開始學習python的時候很多人可能對於lambda函數不了解,感覺和def很混亂,下面我來介紹一下lambda函數我從一下幾個方面來介紹lambda:1、lambda簡介2、lambda與def不同之處3、lambda的使用方法
  • python 內置函數詳解(一)
    該函數是 ord() 的逆函數。枚舉內置函數(類)enumerate,Python 官方文檔描述如下:help(enumerate)Help on class enumerate in module builtins:class
  • Python函數的基本特徵詳解
    那這一節我們先學習函數的最基本用法吧首先我們先學習一下在python中如何去編寫一個函數。今天我們先拋出點兒理論:需要注意的是,函數在python中同在C語言中是有所不同的。當python運行到def語句時,它將會生成一個新的函數對象並將其賦值給這個函數名。和普通對象賦值一樣,函數名就成了某一個函數的引用。python中,萬物皆對象,因此函數也是一種對象,他可以賦值給其他的變量名,並且可以保存在列表之中。第三:函數是通過賦值語句(對象引用)傳遞的。
  • Python 內置函數總結(2/4)
    callabletypeerror大王看到這個函數,是不是覺得眼熟到不行不知道在你寫python的時候出現多少次Ast是python源碼到字節碼的一種中間產物,藉助ast模塊可以從語法樹的角度分析源碼結構。此外,我們不僅可以修改和執行語法樹,還可以將Source生成的語法樹unparse成python源碼。
  • python從零到獨立建設網站,基礎知識,你學過range()函數嗎?
    在python中,如果你確實需要遍歷一個數字序列,內置函數range()會派上用場。()函數比較方便enumerate()函數enumerate(iterable,start=0) 返回一個枚舉對象,iterable必須是一個序列,或iterator,或其它支持迭代的對象。
  • Python中10個常用的內置函數
    (p,q) ,p 代表商 a//b ,q 代表餘數 a%b>>> divmod(21,4)(5, 1)>>> divmod(20.1,3)(6.0, 2.1000000000000014)enumerate(iterable,start=0)iterable
  • Python 中 10 個常用的內置函數
    在 3.8 版本中,Python 解釋器有近 69 個內置函數可供使用,有了它們能極大地提高編碼效率數量雖然不少,但在日常搬磚中只用到其中一部分,根據使用頻率和用法,這裡列出來幾個本人認為不錯的內置函數,結合一些例子介紹給大家complex()
  • Python的range函數與for循環語句
    本篇介紹Python for循環語句和range函數的使用,文中主要討論for循環語句,Python的for循環語句類似於shell或是腳本語言中的foreach循環,可以迭代序列對象。使用range函數可以讓Python的for循環提供類似於傳統的for循環功能。通過本篇的學習,可以達成如下目標。