Python 中的 enumerate() 函數詳解:新手指南
更新日期: 2024 年 10 月 3 日
在 Python 編程中,enumerate() 函數 是一個非常實用的內建函數,特別是在需要同時獲取序列的索引和值時。
對於剛開始學習 Python 的新手來說,理解並掌握 enumerate() 函數的用法,將大大提升你在迭代和遍歷序列時的效率和靈活性。
本文將詳細介紹 Python 中的 enumerate() 函數,包括其基本用法、參數說明、實際應用和注意事項,並提供豐富的示例,幫助你在實際開發中靈活運用。
什麼是 enumerate() 函數?
定義
enumerate() 是 Python 的內建函數,用於在遍歷可迭代物件(如列表、元組、字串等)時,同時獲取元素的索引和值。
它返回一個 enumerate 物件,可以在迭代時產生索引和值的元組。
特點
- 簡潔性:避免手動維護索引變量,代碼更清晰。
- 靈活性:可以指定索引的起始值,默認從 0 開始。
- 適用性:適用於所有可迭代物件。
enumerate() 函數的基本語法
enumerate(iterable, start=0)
- iterable:要迭代的可迭代物件。
- start(可選):索引起始值,默認為 0。
enumerate() 函數的用法示例
遍歷列表
示例:
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
輸出:
0: apple
1: banana
2: cherry
解釋:
- enumerate(fruits) 返回一個 enumerate 物件,在迭代時產生 (index, value) 元組。
- index:元素的索引,從 0 開始。
- fruit:列表中的元素。
指定索引起始值
示例:
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits, start=1):
print(f"{index}: {fruit}")
輸出:
1: apple
2: banana
3: cherry
解釋:
- 設置 start=1,索引從
1
開始計數。
遍歷字串
示例:
text = "Python"
for index, char in enumerate(text):
print(f"字元 {char} 的索引是 {index}")
輸出:
字元 P 的索引是 0
字元 y 的索引是 1
字元 t 的索引是 2
字元 h 的索引是 3
字元 o 的索引是 4
字元 n 的索引是 5
遍歷元組
示例:
numbers = (10, 20, 30)
for index, num in enumerate(numbers):
print(f"索引 {index} 對應的數字是 {num}")
輸出:
索引 0 對應的數字是 10
索引 1 對應的數字是 20
索引 2 對應的數字是 30
為什麼使用 enumerate() 函數?
代碼更簡潔
- 不使用 enumerate():
index = 0
for fruit in fruits:
print(f"{index}: {fruit}")
index += 1
- 使用 enumerate():
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
- 優勢:使用 enumerate() 無需手動維護索引變量,代碼更清晰。
提高可讀性
- 明確的結構:enumerate() 直接提供索引和值,讓迭代過程更加直觀。
減少錯誤
- 避免索引錯誤:手動維護索引容易出現遺漏或錯誤,使用 enumerate() 可以減少這類問題。
實際應用示例
找到列表中某個值的所有索引
示例:
numbers = [3, 5, 2, 3, 7, 3, 9]
target = 3
indices = []
for index, num in enumerate(numbers):
if num == target:
indices.append(index)
print(f"數字 {target} 出現在索引位置:{indices}")
輸出:
數字 3 出現在索引位置:[0, 3, 5]
同時遍歷多個列表
示例:
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
for index, name in enumerate(names):
age = ages[index]
print(f"{name} 的年齡是 {age} 歲。")
輸出:
Alice 的年齡是 25 歲。
Bob 的年齡是 30 歲。
Charlie 的年齡是 35 歲。
遍歷列表時修改元素
示例:
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
fruits[index] = fruit.upper()
print(fruits)
輸出:
['APPLE', 'BANANA', 'CHERRY']
enumerate() 與其他函數的結合使用
與 zip() 結合
- zip():用於將多個可迭代物件壓縮成元組。
- 示例:
letters = ['a', 'b', 'c']
numbers = [1, 2, 3]
for index, (letter, number) in enumerate(zip(letters, numbers)):
print(f"索引 {index}: {letter} - {number}")
輸出:
索引 0: a - 1
索引 1: b - 2
索引 2: c - 3
與列表推導式結合
- 示例:
fruits = ['apple', 'banana', 'cherry']
indexed_fruits = [(index, fruit) for index, fruit in enumerate(fruits, start=1)]
print(indexed_fruits)
輸出:
[(1, 'apple'), (2, 'banana'), (3, 'cherry')]
enumerate() 的注意事項
索引起始值
- 默認值:索引從 0 開始。
- 自定義起始值:可以使用 start 參數指定。
enumerate(iterable, start=10)
可迭代物件
- 支持所有可迭代物件:如列表、元組、字串、集合等。
- 注意:字典遍歷時,enumerate() 會返回鍵的索引和值。 示例:
my_dict = {'a': 1, 'b': 2, 'c': 3}
for index, key in enumerate(my_dict):
print(f"索引 {index}: {key} - {my_dict[key]}")
輸出:
索引 0: a - 1
索引 1: b - 2
索引 2: c - 3
不要修改迭代中的可迭代物件
- 風險:在迭代過程中修改可迭代物件,可能導致意外行為。
- 建議:如需修改,考慮迭代副本或使用索引進行修改。
與手動維護索引的比較
手動維護索引的缺點
- 代碼冗長:需要額外的變量來維護索引。
- 容易出錯:可能忘記更新索引或更新錯誤。
使用 enumerate() 的優勢
- 代碼簡潔:內建索引管理,無需額外變量。
- 可讀性高:結構清晰,一目了然。
總結
- enumerate() 函數 是遍歷可迭代物件時,同時獲取索引和值的便利工具。
- 基本用法:for index, value in enumerate(iterable, start=0):
- 實際應用:查找元素索引、同時遍歷多個列表、修改列表元素等。
- 注意事項:正確使用 start 參數,不要在迭代過程中修改可迭代物件。