在 Python 3 中,循环语句用于重复执行一段代码。与 C++ 或 Java 不同,Python 只有两种循环:for 循环和 while 循环。
其中,for 循环是绝对的主力,因为它专门用于遍历任何可迭代对象(如列表、字符串、字典等),语法极其优雅。
下面我将从 for 循环的核心用法、控制流关键字到高级技巧,为你系统梳理 Python 3 的循环语句。
一、 for 循环:遍历的艺术
for 循环的本质是“迭代器协议”:它会自动从对象中逐个取出元素,直到取完为止。
1. 基础遍历 (列表、字符串、元组)
# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# 遍历字符串
for char in "Python":
print(char, end=" ") # 输出: P y t h o n 2. 配合 range() 生成数字序列
当你需要循环特定次数,或需要索引时,range() 是最佳搭档。
# range(stop): 0 到 stop-1
for i in range(3):
print(i) # 输出: 0, 1, 2
# range(start, stop, step): 指定起点、终点和步长
for i in range(2, 10, 2):
print(i, end=" ") # 输出: 2 4 6 8
# 倒序遍历
for i in range(5, 0, -1):
print(i, end=" ") # 输出: 5 4 3 2 13. 遍历字典 (Dictionary)
user = {"name": "Alice", "age": 25, "city": "Beijing"}
# 默认遍历键 (Keys)
for key in user:
print(key)
# 遍历键值对 (最常用)
for key, value in user.items():
print(f"{key}: {value}")
# 仅遍历值 (Values)
for value in user.values():
print(value)二、 for 循环的黄金搭档:enumerate 与 zip
这是 Python 循环中最能体现“优雅”的两个内置函数,强烈建议掌握。
1. enumerate():同时获取索引和值
新手常犯的错误是 for i in range(len(my_list)):,在 Python 中这被视为不优雅的做法。
fruits = ["apple", "banana", "cherry"]
# ✅ 推荐做法:同时拿到索引 (index) 和值 (fruit)
for index, fruit in enumerate(fruits):
print(f"索引 {index} 的水果是 {fruit}")
# 可以指定起始索引
for index, fruit in enumerate(fruits, start=1):
print(f"第 {index} 个: {fruit}")2. zip():并行遍历多个序列
当你需要同时遍历两个或多个长度相同的列表时,zip 会将它们“打包”成元组。
names = ["Alice", "Bob", "Charlie"]
scores = [95, 88, 92]
for name, score in zip(names, scores):
print(f"{name} 的分数是 {score}")三、 循环控制流:break、continue 与 pass
这三个关键字用于在循环内部精细控制执行流程。
| 关键字 | 作用 | 类比 |
|---|---|---|
break | 立即终止整个循环,跳出循环体。 | 遇到红灯,直接下车不走了。 |
continue | 跳过本次循环的剩余代码,直接进入下一次迭代。 | 遇到红灯,等绿灯亮了继续走。 |
pass | 占位符,什么都不做。用于保持语法完整性。 | 遇到红灯,原地发呆(为了语法不报错)。 |
代码示例:
# break 示例:找到第一个偶数就停止
for num in [1, 3, 5, 8, 9, 10]:
if num % 2 == 0:
print(f"找到偶数: {num}")
break # 循环彻底结束
# continue 示例:跳过所有偶数,只打印奇数
for num in range(1, 6):
if num % 2 == 0:
continue # 跳过本次,不执行下面的 print
print(f"奇数: {num}")
# pass 示例:搭建代码框架时防止报错
for i in range(3):
pass # TODO: 以后再来写这里的逻辑四、 Python 独有特性:循环的 else 子句 🌟
Python 的 for 和 while 循环都可以带一个 else 块。
规则:只有当循环正常结束(即没有被 break 强行打断)时,else 块才会执行。
经典应用场景:搜索与验证
target = "grape"
fruits = ["apple", "banana", "cherry", "orange"]
for fruit in fruits:
if fruit == target:
print(f"✅ 找到了: {target}")
break # 找到了,打断循环,else 将被跳过
else:
# 只有当 for 循环完整遍历完 fruits,且没有触发 break 时,才会执行这里
print(f"❌ 遍历完毕,未找到 {target}")💡 优势:省去了设置 found = False 这样的额外标志变量,代码更 Pythonic。
五、 循环的性能与最佳实践
1. 优先使用“推导式” (Comprehensions) 替代简单的 for 循环
如果循环的目的仅仅是生成一个新的列表、字典或集合,请使用推导式。它在底层由 C 语言优化,运行速度更快,且代码更紧凑。
# ❌ 传统 for 循环 (较慢且啰嗦)
squares = []
for i in range(5):
if i % 2 == 0:
squares.append(i**2)
# ✅ 列表推导式 (更快且优雅)
squares = [i**2 for i in range(5) if i % 2 == 0]2. 避免在循环中修改正在遍历的列表
这会导致索引错乱或跳过元素。
# ❌ 危险操作
nums = [1, 2, 3, 4]
for n in nums:
if n == 2:
nums.remove(n) # 可能会导致后续元素被跳过
# ✅ 安全做法:遍历原列表的副本,或使用推导式生成新列表
nums = [n for n in nums if n != 2]3. for vs while 的选择指南
- 已知迭代次数或需要遍历集合 👉 绝对使用
for循环。 - 未知循环次数,依赖某个条件变为 False 👉 使用
while循环(如等待用户输入、游戏主循环、网络重试)。
总结
Python 的循环设计哲学是 “遍历对象”而非“控制索引”。掌握 for ... in ...、enumerate、zip 以及 break/continue/else 的组合,你就能应对 99% 的循环需求。
你想看一个具体的实战例子吗?比如:如何用循环和 zip 快速合并两个 Excel 表格的数据,或者如何用 while 实现一个带有超时重试机制的网络请求?随时告诉我!