WMX · 随记
·Python· 3 分钟阅读

enumerate:让序号跟着元素一起走

使用 range(len(items)) 取得序号,再通过索引取元素,会把遍历写得较绕。处理日志行号时,还经常把零基索引和一基行号混为一谈。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Python Tutorial for Beginners

Python 入门课程作为语法与编程背景复习;本文使用的较新标准库特性不保证在该课程中逐项覆盖。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

使用 range(len(items)) 取得序号,再通过索引取元素,会把遍历写得较绕。处理日志行号时,还经常把零基索引和一基行号混为一谈。

理解核心机制

enumerate 为每个迭代元素附上计数值,start 控制初始计数,不会跳过输入元素。它能处理生成器,不要求输入支持 len 或下标。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python7 行 · 可横向滚动
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 再过滤才能保留原始行号。遍历过程中增删原列表还会改变迭代行为。

继续练习

交换过滤和编号的顺序,用包含空行的输入比较结果,并确定错误报告应该使用哪一种行号。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档