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