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:占位符

循环让程序能够批量处理数据,是自动化的基础。掌握了循环,你就能让计算机替你干重复的活儿。


练习题

  1. 用 for 循环打印 99 乘法表
  2. 写一个程序,找出 1-100 之间所有的质数
  3. 用 while 循环实现猜数字游戏(程序随机生成 1-100 的数字,用户猜测)

思考题

Python 的 for 循环为什么叫"for-in"而不是"for-i"(像 Java/C 那样)?这种设计有什么好处?


本文代码示例


相关阅读