Skip to content

Python 循环控制 ​

前面我们已经学了 while 和 for。默认情况下,循环会按照条件一直执行,直到自然结束。

现在有三个任务需要改变循环的默认流程:

  1. 密码输入正确后,立即结束整个循环
  2. 遇到重复数据时,跳过本轮,继续下一轮
  3. 查找目标后,区分“找到”和“没有找到”两种结果

这时需要使用 break、continue 和循环 else:

  • break:结束当前循环
  • continue:跳过本轮剩余代码,进入下一轮循环

它们只控制当前所在的这一层循环。

break:终止当前循环 ​

先解决密码校验任务:密码正确后不再询问,密码错误时继续输入。

如果某个条件满足后,不需要再继续循环,就可以使用 break。

break 会直接结束整个循环。

案例:登录账号 ​

需求:反复输入密码。密码正确后,结束循环;密码错误时,继续输入。

python
while True:
    password = input("请输入密码:")

    if password == "123456":
        print("密码输入正确,结束循环")
        break

    print("密码输入错误,请重新输入")

while True 本身不会自然结束。只有执行到 break,程序才会跳出循环。

plantuml Diagram

continue:跳过当前迭代 ​

再处理另一种情况:当前数据不应计入本轮,但后续数据仍然要继续处理。

如果只想跳过本轮后面的代码,但还要继续下一轮循环,就可以使用 continue。

continue 不会结束整个循环,只会跳过当前这一轮。

下面依次处理 1 到 5。遇到数字 3 时,跳过本轮的 print():

python
for number in range(1, 6):
    if number == 3:
        print("跳过数字 3")
        continue

    print(number)

运行结果:

text
1
2
跳过数字 3
4
5

当 number 等于 3 时,continue 后面的 print(number) 不会执行。循环会直接进入下一轮,让 number 得到 4。

plantuml Diagram

continue 与循环条件 ​

在 while 中使用 continue 时,要先确认循环条件能够继续变化,否则容易造成死循环。

下面是一个错误示例。它会一直停在 number == 3,不要直接运行:

python
number = 1

while number <= 5:
    if number == 3:
        continue

    print(number)
    number += 1

当 number 等于 3 时,程序直接执行 continue,因此后面的 number += 1 没有机会执行。

可以把循环变量的更新放到判断之前:

python
number = 0

while number < 5:
    number += 1

    if number == 3:
        continue

    print(number)

案例:限次录入同事姓名 ​

前面分别处理了“结束循环”和“跳过本轮”。现在把两种控制方式放进同一个限次录入任务。

需求:在 5 次有效输入之内,正确输入 3 个不同的同事姓名。

  • 每次有效输入计数一次
  • 重复输入时跳过本轮,不计入次数
  • 正确输入 3 个不同姓名后,挑战成功
  • 用完 5 次仍未完成,挑战失败

已知同事姓名如下:

python
names = "正心,张三,李四,王五,赵六"

处理步骤:

  1. 接收姓名,先判断是否重复
  2. 重复时使用 continue,直接进入下一轮
  3. 非重复输入计入有效次数
  4. 根据姓名是否正确,更新成功次数
  5. 达到成功条件或用完次数时,使用 break 结束循环
plantuml Diagram
参考答案
python
names = "正心,张三,李四,王五,赵六"
recorded_names = ","

count = 0
success_count = 0

while True:
    name = input("请输入同事的名字:")

    # 姓名前后加逗号,避免把姓名中的一部分误判为重复姓名
    if f",{name}," in recorded_names:
        print("姓名已经输入过,请重新输入")
        continue

    count += 1
    recorded_names += f"{name},"

    if f",{name}," in f",{names},":
        success_count += 1
        print(f"{name} 是你的同事")
    else:
        print(f"{name} 不是你的同事")

    if success_count >= 3:
        print("恭喜你,挑战成功")
        break

    if count >= 5:
        print("次数已用尽,挑战失败")
        break

这里必须先判断重复,再执行 count += 1。如果顺序反过来,重复输入也会占用次数。

控制语句的作用范围 ​

如果 break 或 continue 出现在嵌套循环中,它们究竟控制哪一层循环?

在嵌套循环中,break 和 continue 只控制它们所在的当前循环。

python
for row in range(1, 4):
    for col in range(1, 4):
        if col == 2:
            break

        print(row, col)

这里的 break 位于内层循环,所以只会结束内层的 for col。外层的 for row 仍然会继续执行。

嵌套循环中 break 只结束当前内层循环的说明图

循环 else ​

最后处理循环查找任务:循环自然结束和被 break 中断时,结果应该如何区分?

else 不只可以和 if 配合,也可以跟在 while 或 for 后面。

它的执行规则是:

  • 循环自然结束,会执行 else
  • 循环被 break 提前结束,不会执行 else

循环自然结束和 break 提前结束时 else 执行情况的对比图

while 与 else ​

当 while 条件不成立,循环自然结束时,会执行 else:

python
number = 1

while number < 5:
    print(number)
    number += 1
else:
    print("循环正常结束")

for 与 else ​

下面查找数字 3。找到后执行 break,因此不会进入 else:

python
for number in range(1, 6):
    if number == 3:
        print("找到了数字 3")
        break
else:
    print("没有找到数字 3")

循环 else 常用于“循环中查找目标”:循环结束后仍未被 break 打断,说明没有找到目标。

小结 ​

本章沿着三个问题推进:

  1. 条件满足后如何立即停止?使用 break
  2. 当前数据不需要处理时如何继续下一轮?使用 continue
  3. 如何区分循环自然结束和提前中断?使用循环 else

使用 continue 时,还要检查循环变量能否正常更新,避免出现死循环。