Python 教程 06:控制流程-循环语句
“重复是力量之母。”
如果说条件语句让程序会"选择",那循环语句就让程序会"重复"。想象一下,如果要打印 1 到 100 的数字,难道要写 100 行print()吗?循环语句就是为了解决这类重复性工作而生的。
1. for 循环:遍历序列
for 循环用于遍历序列(列表、字符串、范围等)中的每个元素。
基本语法
# 遍历列表
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
print(f"我喜欢吃{fruit}")
# 遍历字符串
for char in "Python":
print(char)
# 遍历字典
user = {"name": "张三", "age": 25, "city": "北京"}
for key in user:
print(f"{key}: {user[key]}")
语法要点:
for 变量 in 序列:- 循环体必须缩进
- 每次循环,变量会依次取序列中的每个值
range()函数
range()生成数字序列,是 for 循环的好搭档。
# range(stop):从0到stop-1
for i in range(5):
print(i) # 0, 1, 2, 3, 4
# range(start, stop):从start到stop-1
for i in range(1, 6):
print(i) # 1, 2, 3, 4, 5
# range(start, stop, step):指定步长
for i in range(0, 10, 2):
print(i) # 0, 2, 4, 6, 8
# 倒序
for i in range(10, 0, -1):
print(i) # 10, 9, 8, ..., 1
enumerate():带索引的遍历
有时候需要同时获取元素和索引:
fruits = ["苹果", "香蕉", "橙子"]
# 传统方法
for i in range(len(fruits)):
print(f"{i}: {fruits[i]}")
# Pythonic方法
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# 指定起始索引
for index, fruit in enumerate(fruits, start=1):
print(f"第{index}个水果:{fruit}")
2. while 循环:条件循环
while 循环在条件为 True 时重复执行,直到条件变为 False。
# 基本while循环
count = 0
while count < 5:
print(f"计数:{count}")
count += 1
# 用户输入验证
password = ""
while password != "123456":
password = input("请输入密码:")
if password != "123456":
print("密码错误,请重试")
print("密码正确!")
注意:while 循环要小心无限循环!确保循环条件最终会变为 False。
# 危险!无限循环
# count = 0
# while count < 5:
# print(count)
# # 忘记count += 1,count永远是0
3. break:跳出循环
break用于立即终止循环,无论条件是否为 True。
# 找到目标就停止
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
target = 5
for num in numbers:
if num == target:
print(f"找到目标:{num}")
break
print(f"检查:{num}")
# 输出:检查:1, 检查:2, 检查:3, 检查:4, 找到目标:5
# while循环中的break
while True: # 无限循环
command = input("请输入命令(输入'quit'退出):")
if command == "quit":
break
print(f"执行命令:{command}")
4. continue:跳过本次循环
continue跳过当前循环的剩余代码,直接进入下一次循环。
# 跳过偶数
for i in range(10):
if i % 2 == 0:
continue # 偶数跳过
print(i) # 只打印奇数:1, 3, 5, 7, 9
# 过滤无效输入
numbers = [1, 2, -1, 4, -5, 6]
sum_value = 0
for num in numbers:
if num < 0:
continue # 跳过负数
sum_value += num
print(f"正数之和:{sum_value}") # 13
break vs continue:
break:跳出整个循环continue:跳过本次循环,继续下一次
就像跑马拉松,break是中途弃赛,continue是跳过一个补给站直接继续跑。
5. else 子句:循环的"善后"
Python 的循环有个独特的特性:else 子句。
# for-else
for i in range(5):
print(i)
else:
print("循环正常结束")
# 用break跳出时不执行else
for i in range(5):
if i == 3:
break
print(i)
else:
print("不会执行") # 因为被break了
else 的执行条件:
- 循环正常结束(没有遇到 break)时执行
- 被 break 打断时不执行
实际应用:查找算法
# 在列表中查找元素
numbers = [1, 2, 3, 4, 5]
target = 6
for num in numbers:
if num == target:
print(f"找到了:{target}")
break
else:
print(f"没找到:{target}")
这个特性在其他语言中很少见,是 Python 的独门绝技。
6. 嵌套循环
循环里可以包含循环。
# 打印乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}×{i}={i*j}", end="\t")
print() # 换行
# 二维列表遍历
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
for row in matrix:
for element in row:
print(element, end=" ")
print()
注意:嵌套循环会增加时间复杂度。两层循环是 O(n²),三层是 O(n³),要慎用。
7. pass:什么都不做
pass是一个占位符,什么都不做。
# 暂时不想实现的循环
for i in range(10):
pass # 稍后再写
# 保持语法正确
if True:
pass # 还没想好写什么
pass就像开会时说"这个问题我们稍后讨论",占个位置,避免语法错误。
8. zip():并行遍历
同时遍历多个序列:
names = ["张三", "李四", "王五"]
ages = [25, 30, 35]
cities = ["北京", "上海", "广州"]
# zip打包成元组
for name, age, city in zip(names, ages, cities):
print(f"{name},{age}岁,来自{city}")
# 输出:
# 张三,25岁,来自北京
# 李四,30岁,来自上海
# 王五,35岁,来自广州
9. 列表推导式预告
for 循环的一个高级用法(下一课详细讲):
# 传统方法:生成1-10的平方
squares = []
for i in range(1, 11):
squares.append(i ** 2)
# 列表推导式:一行搞定
squares = [i ** 2 for i in range(1, 11)]
print(squares) # [1, 4, 9, 16, ..., 100]
10. for vs while:如何选择?
| 场景 | 推荐 | 原因 |
|---|---|---|
| 遍历序列 | for | 简洁、安全、Pythonic |
| 固定次数 | for + range() | 清晰明了 |
| 条件未知 | while | 灵活 |
| 用户输入 | while | 次数不确定 |
| 无限循环 | while True | 明确表达意图 |
经验法则:
- 知道循环次数 → for
- 不知道循环次数 → while
11. 小结
今天我们学习了 Python 的循环语句:
- for 循环:遍历序列,配合 range()、enumerate()、zip()
- while 循环:条件循环,小心无限循环
- break:跳出循环
- continue:跳过本次循环
- else 子句:循环正常结束时执行
- 嵌套循环:循环套循环
- pass:占位符
循环让程序能够批量处理数据,是自动化的基础。掌握了循环,你就能让计算机替你干重复的活儿。
练习题:
- 用 for 循环打印 99 乘法表
- 写一个程序,找出 1-100 之间所有的质数
- 用 while 循环实现猜数字游戏(程序随机生成 1-100 的数字,用户猜测)
思考题:
Python 的 for 循环为什么叫"for-in"而不是"for-i"(像 Java/C 那样)?这种设计有什么好处?
本文代码示例: