Python学习记录-3(enumerate用法详解)
Python 内置函数 enumerate() 用于同时拿到可迭代对象中的“索引”和“值”,返回的是一个惰性迭代器(enumerate 对象)。
一句话记忆:“把 for x in iterable 升级为 for idx, x in enumerate(iterable)”。
1. 函数签名
enumerate(iterable, start=0) -> enumerate object
- iterable:任何可迭代对象(列表、元组、字符串、生成器、文件句柄……)。
- start:索引起始值,默认
0,可设为任意整数(负数也行)。 - 返回值:迭代器,每次产出一个
(index, element)元组。
2. 最常用模式:边遍历边拿索引
names = ['Alice', 'Bob', 'Charlie']
for idx, name in enumerate(names):
print(idx, name)
# 0 Alice
# 1 Bob
# 2 Charlie
3. 经典场景举例
3.1 指定起始索引
weekdays = ['Mon', 'Tue', 'Wed']
for num, day in enumerate(weekdays, start=1):
print(f'{num}: {day}')
# 1: Mon
# 2: Tue
# 3: Wed
3.2 配合列表推导式
# 把字符串列表变成 (行号, 大写) 的元组列表
lines = ['hello', 'world', 'python']
indexed_upper = [(i, s.upper()) for i, s in enumerate(lines)]
# [(0, 'HELLO'), (1, 'WORLD'), (2, 'PYTHON')]
3.3 遍历文件内容并打印行号
with open('data.txt') as f:
for lineno, line in enumerate(f, 1):
print(f'{lineno}: {line.rstrip()}')
3.4 与 zip 组合:同时遍历两列表并带索引
xs = [10, 20, 30]
ys = ['a', 'b', 'c']
for idx, (x, y) in enumerate(zip(xs, ys)):
print(idx, x, y)
# 0 10 a
# 1 20 b
# 2 30 c
3.5 反向索引(负数)
nums = [100, 200, 300]
for neg_idx, val in enumerate(nums, start=-len(nums)):
print(neg_idx, val)
# -3 100
# -2 200
# -1 300
4. 与手动 range(len(...)) 对比
| 写法 | 是否同时拿到索引+元素 | 是否惰性 | 代码可读性 |
|---|---|---|---|
for i in range(len(seq)): |
否(需 seq[i]) |
否(先生成 range) | 一般 |
for i, x in enumerate(seq): |
是 | 是 | 高 |
5. 小结
- 功能:在循环中自动提供索引。
- 惰性:不一次性占内存,可处理大文件/生成器。
- 技巧:
- 需要行号 →
enumerate(lines, 1) - 需要反向索引 →
enumerate(seq, -len(seq)) - 需要索引+多值 →
for i, (a, b) in enumerate(zip(...))
- 需要行号 →
记住模板即可:
for index, value in enumerate(iterable, start=0):
...
浙公网安备 33010602011771号