enumerate:让序号跟着元素一起走
使用 range(len(items)) 取得序号,再通过索引取元素,会把遍历写得较绕。处理日志行号时,还经常把零基索引和一基行号混为一谈。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Python Tutorial for Beginners
Python 入门课程作为语法与编程背景复习;本文使用的较新标准库特性不保证在该课程中逐项覆盖。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
使用 range(len(items)) 取得序号,再通过索引取元素,会把遍历写得较绕。处理日志行号时,还经常把零基索引和一基行号混为一谈。
理解核心机制
enumerate 为每个迭代元素附上计数值,start 控制初始计数,不会跳过输入元素。它能处理生成器,不要求输入支持 len 或下标。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
lines = iter(["alpha", "", "gamma"])
nonempty = []
for line_number, text in enumerate(lines, start=1):
if text:
nonempty.append((line_number, text))
assert nonempty == [(1, "alpha"), (3, "gamma")]
print(nonempty)适用边界与常见误区
先过滤再 enumerate 得到的是过滤后的位置,先 enumerate 再过滤才能保留原始行号。遍历过程中增删原列表还会改变迭代行为。
继续练习
交换过滤和编号的顺序,用包含空行的输入比较结果,并确定错误报告应该使用哪一种行号。