本文目录导读:
enumerate() 是 Python 中一个非常实用的内置函数,它用于在遍历可迭代对象(如列表、元组、字符串等)时,同时获取元素的索引和值。
它的核心作用是:让循环更简洁,避免手动维护计数变量。
基本语法
enumerate(iterable, start=0)
iterable:需要遍历的序列(列表、元组、字符串等)或任何可迭代对象。start:可选参数,表示索引的起始值,默认是 0。
enumerate() 返回一个枚举对象,它生成包含索引和值的元组 (index, value)。
用法详解与示例
基本用法(vs 传统方式)
不使用 enumerate(传统方式):
fruits = ['apple', 'banana', 'cherry']
i = 0
for fruit in fruits:
print(i, fruit)
i += 1
# 输出:
# 0 apple
# 1 banana
# 2 cherry
使用 enumerate(推荐方式):
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
print(index, fruit)
# 输出:
# 0 apple
# 1 banana
# 2 cherry
可见代码更简洁,且不易出错。
自定义起始索引(start 参数)
如果不想从 0 开始,可以指定 start:
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits, start=1):
print(f"{index}. {fruit}")
# 输出:
# 1. apple
# 2. banana
# 3. cherry
这在生成编号列表(如菜单、题目序号)时非常有用。
与其它可迭代对象结合使用
字符串:
for i, char in enumerate("hello"):
print(f"Position {i}: '{char}'")
# 输出:
# Position 0: 'h'
# Position 1: 'e'
# Position 2: 'l'
# Position 3: 'l'
# Position 4: 'o'
元组:
t = (10, 20, 30)
for i, val in enumerate(t):
print(i, val)
集合(set)或字典(dict):
- 对于集合,索引顺序不固定(集合是无序的)。
- 对于字典,
enumerate默认遍历键。
d = {'a': 1, 'b': 2, 'c': 3}
for i, key in enumerate(d):
print(i, key, d[key])
# 输出(字典顺序可能是随机的,但在 Python 3.7+ 中保持插入顺序):
# 0 a 1
# 1 b 2
# 2 c 3
在列表推导式中使用
fruits = ['apple', 'banana', 'cherry'] indexed_fruits = [(i, f.upper()) for i, f in enumerate(fruits)] print(indexed_fruits) # 输出:[(0, 'APPLE'), (1, 'BANANA'), (2, 'CHERRY')]
常见应用场景
-
同时获取元素和它的位置(替换
range(len(list)))- 不好的写法:
for i in range(len(my_list)): print(i, my_list[i]) - 好的写法:
for i, item in enumerate(my_list): print(i, item)
- 不好的写法:
-
在循环中根据索引修改列表
nums = [1, 2, 3, 4, 5] for i, val in enumerate(nums): if val % 2 == 0: nums[i] = val * 10 print(nums) # [1, 20, 3, 40, 5] -
在模板/格式化输出中自动编号
items = ["Python", "Java", "C++"] for num, lang in enumerate(items, 1): print(f"{num}. {lang}") # 1. Python # 2. Java # 3. C++ -
在文件处理中记录行号
with open('data.txt', 'r') as f: for line_num, content in enumerate(f, 1): if 'error' in content: print(f"Line {line_num}: {content.strip()}")
| 特性 | 说明 |
|---|---|
| 返回值 | 枚举对象,每次迭代返回 (index, value) 元组 |
| 效率 | 惰性求值,不会一次性生成所有结果,内存友好 |
| 可读性 | 比手动维护计数器或使用 range(len()) 更 Pythonic |
| 安全性 | 避免因手动更新索引而导致的 bug |
易错提醒
enumerate生成的是(index, value),不是(value, index),解包时顺序要注意- 默认
start=0,如果需要从 1 开始,显式传入start=1 - 对于无序集合(如
set),索引值不保证与元素顺序有明确对应关系
一句话总结:enumerate() 让你在遍历时轻松拿到序号,写更干净、更 Pythonic 的循环代码。