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):
    ...
posted on 2025-08-05 16:49  奶油阿黄不吃辣  阅读(44)  评论(0)    收藏  举报