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

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


练习题

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

思考题

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


本文代码示例


相关阅读