python enumerate 函数是 Python 内置的迭代工具,核心作用是在遍历列表 元组 字符串这类可迭代对象的时候,同时拿到元素的索引下标和元素本身,不用自己额外定义计数器变量做累加,传统写法要新建 i 等于 0,每次循环 i 加一,代码冗余还容易写错,使用 enumerate 之后可以一次性返回下标和值,它返回的是 enumerate 迭代器对象,不是直接生成列表,需要配合 for 循环解包,还支持设置起始下标,默认是从 0 开始,这个函数在数据处理 日志打印 查找元素位置 批量修改序列内容场景非常常用,很多新手容易混淆 enumerate 和 range,range 只生成数字序号,enumerate 是序号绑定原始元素,下面分层深度讲解语法 参数 返回值 基础案例 进阶用法 常见坑点。
一 基础语法格式
清单
语法 enumerate iterable start 等于 0
iterable 必填 参数,可迭代对象,支持列表 元组 字符串 集合 字典等
start 可选参数,代表索引起始值,默认值是 0,可以改成 1 2 等自定义起始序号
返回值 enumerate 迭代器对象,每一次迭代产出一个元组,元组里面第一项是索引,第二项是原始元素
二 传统写法对比
清单
传统计数器写法
i = 0
for item in 列表
print i item
i = i + 1
enumerate 优化写法
for index item in enumerate 列表
print index item
对比优势 省去手动维护计数器,代码简洁,不容易出现忘记自增的 bug
三 基础代码示例
清单
示例 1 默认从 0 开始遍历列表
names = ["张三","李四","王五"]
for idx, val in enumerate (names):
print (idx, val)
输出结果
0 张三
1 李四
2 王五
示例 2 设置 start 等于 1,序号从 1 开始
names = ["张三","李四","王五"]
for idx, val in enumerate (names, start=1):
print (idx, val)
输出结果
1 张三
2 李四
3 王五
示例 3 遍历字符串
for idx, char in enumerate ("python"):
print (idx, char)
四 进阶常用场景
清单
查找指定元素对应的下标,遍历的时候判断元素是否匹配,命中就保存当前 idx
批量修改列表元素,根据下标定位,对满足条件元素做替换
生成带序号的输出,比如导出表格 打印日志,序号从 1 开始展示
配合列表推导式,快速生成带索引的新列表
转换成 list,list enumerate 对象,可以一次性看到全部元组,适合调试查看内容
五 关键特性对照表
| 项目 | 说明 |
|---|---|
| 函数类型 | Python 内置函数,不需要 import 导入 |
| 返回类型 | 惰性迭代器,不会一次性加载全部数据 |
| 索引默认值 | 0 |
| 支持对象 | 所有可迭代对象 |
| 是否修改原序列 | 不会改动原始可迭代对象 |
六 常见易错点
清单
第一 误以为 enumerate 返回列表,实际是迭代器,如果直接 print enumerate,只会显示对象地址,需要转 list 或者 for 循环遍历
第二 start 参数理解错误,start 只是修改起始编号,不会改变原始数据本身顺序
第三 解包变量数量写错,每次循环是二元元组,for 后面必须写两个变量,只写一个会拿到完整元组
第四 应用在生成器对象的时候,enumerate 遍历完成之后迭代器就耗尽,不能二次重复遍历
第五 和 range len 混用,range len 也可以实现下标遍历,但是可读性不如 enumerate,优先推荐 enumerate
七 实操使用步骤
第一步 确认要遍历的对象是可迭代序列,比如列表或者字符串。第二步 决定是否需要自定义起始序号,不需要就省略 start 参数。第三步 for 循环解包成两个变量,分别接收索引和元素。第四步 在循环体内使用索引做判断 修改 打印等业务逻辑。第五步 如果需要保存全部结果,可以把 enumerate 对象转成 list,注意大数据量不要强行转 list,会占用内存。
【常见问题】
问题 1 pythonenumerate 函数默认索引是从几开始
回答 1 pythonenumerate 函数默认 start 参数等于 0,pythonenumerate 函数遍历的时候索引默认从 0 开始,如果需要业务序号从 1 开始,调用 pythonenumerate 函数的时候传入 start 等于 1。
问题 2 pythonenumerate 函数返回的是列表吗
回答 1 pythonenumerate 函数返回的是 enumerate 迭代器对象,pythonenumerate 函数不是直接返回列表,pythonenumerate 函数如果需要看到全部内容,需要用 list 把 pythonenumerate 函数生成的迭代器转换为列表。
问题 3 pythonenumerate 函数可以遍历字典吗
回答 1 pythonenumerate 函数支持遍历字典,pythonenumerate 函数遍历字典默认拿到的是字典键的序号和键本身,如果想要同时拿到键和值,需要先调用 items,再套 pythonenumerate 函数。
问题 4 pythonenumerate 函数和 range len 有什么区别
回答 1 pythonenumerate 函数是同时拿到下标和元素,range len 只能生成下标数字,还要再通过下标取值,pythonenumerate 函数代码可读性更好,pythonenumerate 函数是 Python 推荐的下标遍历写法。
【免责申明】
本文 pythonenumerate 函数相关讲解基于 Python 标准内置函数官方定义,不同 Python 版本行为保持一致,本文仅作为编程学习参考,正式项目代码规范请结合团队编码标准。


