1. for 循环是什么? #
for 循环 用于遍历可迭代对象 (列表、字典、字符串、文件每一行、数据库查询结果等)。
每次循环把下一个元素赋给循环变量,并执行同一段缩进代码块。
与 while「先判断条件再执行」不同,for 更适合「集合里有多少项就处理多少项」的批处理逻辑。
全栈开发里几乎每天都会用到:遍历用户列表发通知、逐条校验请求字段、汇总订单金额、按行读日志等。
Python 的 for 不依赖下标,直接 for item in collection 即可,比 C/Java 式 for (i=0; i<n; i++) 更简洁。
for fruit in ["apple" , "banana" , "cherry" ]:
print (fruit)2. 基本语法 #
结构固定为 for 变量 in 可迭代对象: ,下一行起是循环体 ,必须缩进(通常 4 个空格)。
每次迭代,变量 被赋值为可迭代对象中的下一个元素,直到全部取完,循环自动结束。
循环体里可以写任意语句:赋值、条件判断、嵌套 for、甚至 break / continue。
「可迭代对象」包括列表、元组、字符串、字典、集合、range() 结果、文件对象等。
只要对象支持迭代器协议,就能放在 in 后面。
循环变量名应有意义,如 for user in users,便于阅读和维护。
for 变量 in 可迭代对象:
3. 遍历集合 #
不同容器遍历方式略有差别:列表/元组/集合/字符串 直接 for x in obj。
字典 默认遍历键,业务里更常用 items() 同时拿键和值。
下面分类型给出最常见写法。
3.1 列表 #
列表是最典型的 for 场景:按顺序处理每个元素,不关心下标时直接 for item in lst 即可。
users = ["Alice" , "Bob" , "Charlie" ]
for user in users:
print (user)3.2 字典 #
遍历字典时,for key in d 只得到键。
处理 JSON、ORM 字段、配置项时,更常用 for key, value in d.items() 同时拿到键和值。
仅需值时用 values() 。
person = {"name" : "Alice" , "age" : 30 , "city" : "Beijing" }
for key, value in person.items():
print (f"{key} : {value} " )
for key in person:
print (key)
for value in person.values():
print (value)
字符串、元组、集合同理:for x in obj。
4. range():按次数或索引循环 #
range() 生成一个整数序列 ,本身不一次性列出所有数,而是按需产生。
适合「循环固定次数」或「只要 0 到 n-1 的下标」。
三种常见形式:
range(stop) :从 0 到 stop - 1,步长 1,如 range(5) → 0, 1, 2, 3, 4
range(start, stop) :从 start 到 stop - 1,如 range(2, 6) → 2, 3, 4, 5
range(start, stop, step) :指定步长;step 可为负,实现倒序,如 range(10, 0, -2) → 10, 8, 6, 4, 2
stop 始终是开区间上界 ,不包含在序列内。
需要按下标访问列表时,更推荐下一节的 enumerate() ,而不是 for i in range(len(lst)),后者冗长且易错。
for i in range (5 ):
print (i)
for i in range (2 , 6 ):
print (i)
for i in range (0 , 10 , 2 ):
print (i)5. enumerate():同时拿索引和元素 #
当循环里既要元素又要索引 (打印序号、写「第几条失败」、按位置更新列表等)时,用 enumerate(iterable) 一次解包 index, item 。
默认索引从 0 开始;展示给用户时可传 start=1 ,让编号从 1 起。
这比 for i in range(len(lst)): x = lst[i] 更 Pythonic,也避免越界。
fruits = ["apple" , "banana" , "cherry" ]
for index, fruit in enumerate (fruits):
print (index, fruit)
for index, fruit in enumerate (fruits, start=1 ):
print (index, fruit)6. break 与 continue #
循环体内可用 break 和 continue 改变默认流程。
break 立即结束整个循环 ,常用于「已找到目标、无需再扫」。
continue 跳过本次 循环剩余代码,直接进入下一轮,常用于「某些条件不满足就跳过该项」。
二者只影响所在的那一层 循环;嵌套循环时不会自动跳出外层。
语句
作用
break
立即结束整个循环
continue
跳过本次剩余代码,进入下一轮
for num in [2 , 5 , 8 , 12 , 7 ]:
if num > 10 :
print (f"找到: {num} " )
break
print (f"检查: {num} " )
for i in range (10 ):
if i % 2 == 0 :
continue
print (i)7. zip():并行遍历多个序列 #
zip(a, b, ...) 把多个可迭代对象按位置配对 ,每次迭代返回一个元组。
常用 for x, y in zip(a, b) 并行遍历。
典型场景:姓名列表与分数列表对齐输出、多列 CSV 字段同时处理。
若各序列长度不一致 ,zip 以最短 为准,多出的元素被忽略。
需要严格等长时应先校验长度。
names = ["Alice" , "Bob" , "Charlie" ]
scores = [85 , 92 , 78 ]
for name, score in zip (names, scores):
print (f"{name} : {score} " )8. 列表推导式 #
列表推导式 把 for 循环 + 条件 + 追加新列表压缩成一行:[表达式 for 变量 in 可迭代对象 if 条件] ,if 可省略。
适合对每个元素做映射 (如平方)或过滤 (如只保留正数)。
比手写 result = []; for ...: result.append(...) 更简洁,项目里处理接口字段、批量格式化时很常见。
逻辑复杂或嵌套过深时应改回普通 for,可读性优先 。
numbers = [2 , 4 , 6 , 8 , 10 ]
squares = [x ** 2 for x in range (5 )]
print (squares)
positive = [x for x in numbers if x > 0 ]
print (positive)9. 常见注意点 #
写 for 循环时有两类易错点:遍历时修改正在遍历的容器 会导致元素被跳过或行为难料。
无意义的变量名 (如 for i in l)降低可读性。
删除或过滤列表元素时,应遍历副本 、用推导式生成新列表 ,或倒序遍历(了解即可),不要边 for 边 remove。
循环变量名应表达含义:for student in students、for order_id in order_ids,便于 Code Review 和后期维护。
numbers = [2 , 4 , 6 , 8 ]
for num in numbers:
if num % 2 == 0 :
numbers.remove(num)
numbers = [num for num in numbers if num % 2 != 0 ]10. 项目开发要点 #
日常业务大量是「一批数据逐项处理」,对照下面几条可选最合适的遍历方式。
遍历集合用 for,不要用 while + 下标 (除非有特殊需求)。
字典优先 for k, v in d.items() ,处理 ORM 字段、JSON、配置时常用。
需要索引用 enumerate() ,少用 range(len(lst))。
读文件 :for line in open(...) 或 for line_num, line in enumerate(f, 1):。
过滤、映射列表 可考虑列表推导式,保持可读即可,不宜嵌套过深。
嵌套循环 :二维数据、组合遍历时会用到;注意性能,大数据考虑向量化或数据库层处理。
11. 总结 #
本章核心:用 for 遍历可迭代对象 。
配合 range、enumerate、zip 处理次数、索引与多列数据。
用 break/continue 控制流程;简单映射过滤可用列表推导式。
下表可作速查。
概念
语法
用途
基本循环
for item in collection:
遍历元素
数字序列
range(start, stop, step)
固定次数或数字序列
索引+元素
enumerate(collection)
同时拿索引和值
多序列
zip(a, b)
并行遍历
控制流程
break / continue
提前结束或跳过本次
生成列表
[expr for x in iterable]
简洁地构造新列表