Enumerate (枚举)
enumerate 是 Python 内置函数:
在遍历可迭代对象时,同时返回 “索引 + 元素”。
它让循环更简洁、更安全、更高效。
for index, value in enumerate(["a", "b", "c"]):
print(index, value)
输出:
0 a
1 b
2 c
for i, v in enumerate(["a", "b", "c"], start=1):
print(i, v)
输出:
1 a
2 b
3 c
for i, item in enumerate(items):
...
for i, val in enumerate(nums):
nums[i] = val * 2
for i, ch in enumerate("hello"):
print(i, ch)
用于处理双序列并包含索引:
for i, (a, b) in enumerate(zip(list1, list2)):
print(i, a, b)
for entry in enumerate(["x", "y"]):
print(entry)
输出:
(0, 'x')
(1, 'y')
也可以:
i, val = entry
for i, _ in enumerate(items):
print(i)
idx = next((i for i, v in enumerate(nums) if v == target), -1)
for i, v in sorted(enumerate(nums), key=lambda x: x[1]):
print(i, v)
indexed = [(i, v) for i, v in enumerate(items)]
| 写法 | 可读性 | 安全性 | Pythonic |
|---|---|---|---|
| for i in range(len(x)) | ❌ 差 | ❌ 容易越界 | ❌ |
| for i, v in enumerate(x) | ✅ | ✅ | ✅ |
理由:
- range(len()) 需要自己取元素(麻烦)
- 容易写错
- enumerate 可读性更高
- enumerate 不依赖“长度”概念(适用范围更广)
enumerate 内部用 C 实现,性能非常高。
实际性能测试:
for i in range(len(a)): ... # 慢
for i, v in enumerate(a): ... # 快
enumerate 更快、更容易被 Python 优化。
enumerate(iterable, start=0)
- iterable:列表、元组、字符串、生成器……
- start:初始索引
返回:enumerate 对象(惰性迭代器)
list(enumerate("ab"))
# [(0, 'a'), (1, 'b')]
for i, v in enumerate(items):
if v == target:
break
for i, item in enumerate(items):
...
for i, item in enumerate(items, 1):
...
idx = next((i for i, x in enumerate(items) if x == "target"), None)
for i, (a, b) in enumerate(zip(list1, list2)):
...
- 让循环更 Pythonic
- 更安全、可读
- 性能更高
- 用法灵活,适合搭配解包、zip、生成器等
如果需要 index -> 一律用 enumerate。
如果不需要 index -> 一律用 for item in iterable。