python for循环遍历序列时修改元素需用enumerate()或列表推导式;range是惰性生成器;for-else的else仅在未break时执行;遍历字典须用d.items()而非d.items。

for 循环遍历 list/tuple/str 时,别直接改原序列
Python 的 for 循环本质是迭代器协议,不是“按索引查表”。你写 for x in my_list:,x 是元素副本,不是引用;修改 x 不会影响 my_list 本身。
常见错误现象:for item in data: if item == 'bad': item = 'good' —— 这行不通,data 一点没变。
- 真要就地修改,用
enumerate()获取索引:for i, item in enumerate(data): if item == 'bad': data[i] = 'good' - 想过滤或转换,优先用列表推导式:
[x.upper() for x in words if x],比for+append()更安全、更 Pythonic - 边遍历边
del或.pop()?会跳过下一个元素。该用列表推导式过滤,或反向遍历:for i in range(len(lst)-1, -1, -1): if ...: del lst[i]
range() 不是 list,它是个生成器对象
range(10) 返回的是 range 对象,不是 list。它只存起点、终点、步长,不占内存;只有被迭代(比如进 for)或显式转成 list 时才生成数字。
使用场景:循环次数确定、需要索引、或做等差数列计算时最常用。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 参数差异:
range(stop)、range(start, stop)、range(start, stop, step);注意stop永远不包含在内 - 负步长必须保证逻辑成立:
range(5, 0, -1)可以,range(0, 5, -1)直接空——不会报错,但循环体一次都不执行 - 性能影响:大范围如
range(10**6)几乎零内存开销;而list(range(10**6))立刻吃掉几十 MB 内存
for 循环里 break/continue/else 的真实行为
else 子句不是“如果循环结束就执行”,而是“如果循环没被 break 中断,就执行”。这是最容易误解的点。
常见错误现象:以为 for x in seq: ... else: print('done') 是“循环完了都执行”,结果加了 break 后 else 就不跑了,一脸懵。
-
continue跳过本轮剩余代码,直接进入下一轮迭代 -
break立刻退出整个循环,后续迭代和else都跳过 -
else只在正常结束(即所有元素遍历完,没触发break)时运行;可用于搜索场景:for x in items: if x == target: print('found'); break else: print('not found')
遍历字典时,默认只拿到 key,不是 key-value 对
写 for k in my_dict:,k 是键;想拿值,得用 my_dict[k];想同时拿键值,必须显式调用 .items()。
使用场景:处理配置、映射关系、计数统计等。
- 只遍历 key:
for key in d:或for key in d.keys():(后者稍慢,不必要) - 只遍历 value:
for v in d.values():—— 注意:values()返回视图,不是 list;Python 3.7+ 顺序与插入一致 - 遍历键值对:
for k, v in d.items():—— 必须解包两个变量,少一个会报ValueError: too many values to unpack - 兼容性注意:Python 2 的
.iteritems()已废弃;3.x 统一用.items(),它返回的是动态视图,不是快照
.items() 的括号,写成 d.items —— 它不报错,但循环里拿到的是一个方法对象,接着 for k, v in d.items: 就直接 TypeError。这个错不明显,尤其从其他语言转过来的人容易卡住。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










