查看全课大纲(第 20 / 51 节)
  1. 1.Python 是什么?为什么值得学?
  2. 2.如何为 Python 编程准备一个“全家桶”环境?
  3. 3.Python 有哪几种执行方法?
  4. 4.行与缩进到底有什么用?
  5. 5.注释有什么用,怎么写?
  6. 6.变量:如何给数据起个好名字?
  7. 7.运算符的优先级和常见坑点是什么?
  8. 8.Python 中,数字和布尔值究竟有哪几种?
  9. 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
  10. 10.如何将程序的结果展示给用户或保存下来?
  11. 11.CSV 文件怎么读怎么写才方便?
  12. 12.列表是什么,如何创建和访问它?
  13. 13.列表的修改操作,有哪些方法?
  14. 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
  15. 15.判断语句:如何让程序根据条件做不同的事?
  16. 16.for 循环如何遍历序列中的元素?
  17. 17.while 循环什么时候才会停?
  18. 18.while 循环的结束条件,你写对了吗?
  19. 19.循环中途想提前结束,怎么办?
  20. 20.`break` 和 `continue` 到底有什么区别?
  21. 21.列表推导式如何让代码更简洁高效?
  22. 22.字符串怎么定义、拼接和操作?
  23. 23.元组:为什么定义单个元素时要加逗号?
  24. 24.集合(set)怎么用?如何快速去重和做集合运算?
  25. 25.字典是什么,为什么比列表更方便?
  26. 26.字典的增删改查与遍历,如何避免 KeyError?
  27. 27.函数里的变量,为什么有的能用有的不能用?
  28. 28.在函数内部修改全局变量,为什么有时不生效?
  29. 29.函数里能修改全局变量吗?返回值怎么用?
  30. 30.匿名函数:如何用 lambda 快速定义简单函数?
  31. 31.面向对象编程是什么,为什么需要它?
  32. 32.类中的方法和属性到底怎么定义和使用?
  33. 33.如何控制对对象内部属性和方法的访问?
  34. 34.异常发生时,程序会怎样继续执行?
  35. 35.如何组织代码:包和模块
  36. 36.`if __name__ == '__main__'` 到底有什么用?
  37. 37.如何用 IDE 的 Debug 功能排查程序错误?
  38. 38.Matplotlib 绘图的第一步该做什么?
  39. 39.Figure 是什么,如何设置图形尺寸?
  40. 40.如何自定义 Matplotlib 的坐标轴?
  41. 41.如何为图表添加图例,让不同曲线一目了然?
  42. 42.饼图怎么画才能直观展示数据占比?
  43. 43.如何用 Matplotlib 绘制散点图?
  44. 44.柱状图怎么画?
  45. 45.如何使用 Matplotlib 绘制等高线图?
  46. 46.如何在 Matplotlib 中绘制子图?
  47. 47.zip 函数如何把多个列表“打包”在一起?
  48. 48.如何给可迭代对象加上索引?
  49. 49.random 模块如何生成随机数?
  50. 50.math 模块怎么用?
  51. 51.Counter 如何快速统计元素出现次数?

`break` 和 `continue` 到底有什么区别?

约 12 分钟

break 和 continue 到底有什么区别?

小象实战讲义 · Python 编程从入门到实践

上一节我们弄清了 break 的作用:它会结束当前这一层循环,程序接着执行循环之后的代码。本节先用完整例子验证 break 在 while、for 和嵌套循环中的表现,再学习它的搭档 continue,最后用一道填空题检验你对两者的理解。

💡 核心导读

  • break:立即结束它所在的整个循环,跳到循环之后。
  • 嵌套循环中的 break:只结束离它最近的那一层,外层继续执行。
  • continue:跳过本次循环中剩余的语句,直接进入下一次迭代。
  • while + continue 的陷阱:更新循环变量的语句要放在 continue 之前,否则可能死循环。
  • 两者的区别:break 结束整个循环,continue 只结束本次循环。

回顾:break 会跳到哪里

上一节的结论是:break 触发后,循环体内它后面的语句不再执行,程序直接执行循环之后的代码。这个结论对 while 和 for 都成立。下面用同一段“打印 1~20 的偶数、遇到 10 的整数倍就停”的逻辑,分别在两种循环里跑一遍。

break 在 while 与 for 循环中

# 1) while 循环:打印 1~20 的偶数,遇到 10 的整数倍时结束整个循环
i = 1
while i <= 20:
    if i % 2 == 0:
        if i % 10 == 0:
            print("遇到 {},触发 break,while 循环结束".format(i))
            break
        print(i)
    i += 1
print("循环外的代码继续执行(while 版本)")

print("-" * 10)

# 2) for 循环:同样的逻辑,行为完全一致
for i in range(1, 21):
    if i % 2 == 0:
        if i % 10 == 0:
            print("遇到 {},触发 break,for 循环结束".format(i))
            break
        print(i)
print("循环外的代码继续执行(for 版本)")
2
4
6
8
遇到 10,触发 break,while 循环结束
循环外的代码继续执行(while 版本)
----------
2
4
6
8
遇到 10,触发 break,for 循环结束
循环外的代码继续执行(for 版本)

执行过程:

  1. i 从 1 开始,2、4、6、8 是偶数且不是 10 的整数倍,依次被打印。
  2. 当 i 等于 10 时,它同时满足“偶数”和“10 的整数倍”,break 被触发,整个循环立即结束。
  3. break 后面的 print(i) 不会执行,所以 10 本身也不会被打印;i += 1 同样被跳过。
  4. 程序跳出循环,执行循环之后的 print。for 版本的结果完全相同,只是循环的写法不同。

break 在嵌套循环中:只结束内层

# 外层循环控制行数,内层循环打印星号;内层 j 等于 3 时跳出内层
i = 1
while i < 5:
    j = 0
    while j < i:
        if j == 3:
            break  # 只结束内层的 while j < i 循环
        print("*", end="")
        j += 1
    print(i)  # 外层循环的代码继续执行
    i += 1
*1
**2
***3
***4

执行过程:

  • 前 3 行(i=1, 2, 3):内层循环正常执行,星号数量等于 i。
  • 第 4 行(i=4):内层 j 从 0 增加到 3,当 j == 3 时 break 触发,内层循环立即结束,因此第 4 个星号没有被打印。
  • 外层 while i < 5 不受影响,继续执行完这一轮,所以行号 4 仍然被打印。

continue:只跳过本次循环

continue 不会结束整个循环,它只会让本次循环提前收尾:continue 之后、属于本次循环的语句不再执行,程序直接回到循环开头,开始下一轮。

while 条件:
    if 条件:
        continue   # 本次循环到此为止,后面的语句不执行
    代码语句       # 本次被跳过,下一次仍可能执行

对 while 来说,continue 之后会重新判断循环条件;对 for 来说,continue 之后会直接取出序列中的下一个元素。

continue 在 while 循环中(注意更新位置)

# 打印 1~20 的偶数,但跳过 10 的整数倍
i = 0
while i < 20:
    i += 1  # 关键:循环变量的更新必须放在 continue 之前
    if i % 2 == 0:
        if i % 10 == 0:
            continue  # 跳过本次循环,不执行下面的 print(i)
        print(i)
print("循环结束(while 版本)")
2
4
6
8
12
14
16
18
循环结束(while 版本)

数字 10 和 20 满足 i % 10 == 0,执行 continue 后直接进入下一轮,因此没有被打印;12、14、16、18 照常输出。如果把 i += 1 放到 continue 之后,程序第一轮就会卡在 i = 0:0 是偶数,也满足 i % 10 == 0,continue 直接跳过 i += 1,i 永远停在 0,while i < 20 永远成立,程序零输出、陷入死循环。

continue 在 for 循环中

# 用 for 循环实现同样的功能:跳过 10 的整数倍
for i in range(1, 21):
    if i % 2 == 0:
        if i % 10 == 0:
            continue
        print(i)
print("循环结束(for 版本)")
2
4
6
8
12
14
16
18
循环结束(for 版本)

for 循环的迭代变量由循环自动更新,所以这里不需要像 while 那样手动把 i += 1 提到前面,写起来更直观,输出也与 while 版本一致。

📝 动手练一练

补全下面这段代码,使其功能为:让用户反复输入整数——输入 3 时让用户继续输入下一个数字;输入 7 时结束循环;输入其他数字时,计算并打印它的平方根。

import math

while True:                                # 死循环:正常情况下会一直循环
    input_num = int(input('请输入一个整数:'))
    # 条件1:当 input_num 等于 3 时,应该______
    # 条件2:当 input_num 等于 7 时,应该______
    # 其他情况,计算平方根并打印
    print('{} 的开方是:{:.3f}'.format(input_num, math.sqrt(input_num)))
👉 点击查看参考答案

思路:

  • 输入 3 时要求“让用户继续输入”,即跳过本次循环剩余部分,直接进入下一次,对应 continue。
  • 输入 7 时要求“结束循环”,即跳出整个 while True 循环,对应 break。
import math

while True:
    # 为便于讲义运行,这里把 input() 换成固定值;实际练习时请改回 input('请输入一个整数:')
    input_num = 5

    if input_num == 3:
        continue  # 跳过本次循环,等待下一次输入
    if input_num == 7:
        break     # 跳出整个循环,结束程序
    print('{} 的开方是:{:.3f}'.format(input_num, math.sqrt(input_num)))
    break  # 演示时计算一次就退出;实际练习中可去掉这一句
5 的开方是:2.236

常见错误

错误写法现象或报错原因正确写法
while i < 10:
    if i == 5:
        continue
    print(i)
    i += 1
程序在 i == 5 时卡住不动,陷入死循环continue 跳过了 i += 1,i 永远等于 5,循环条件永远成立把 i += 1 放到 continue 之前执行
混淆 break 和 continue 的效果想提前结束循环却只跳过了一次,或想跳过某次却把循环结束了两个关键字的作用范围不同:一个结束整个循环,一个只结束本次break 用于终止整个循环;continue 用于跳过当前这一次,进入下一次
在嵌套循环中,以为 break 能跳出所有循环内层结束后外层仍在继续,结果不符合预期break 只作用于离它最近的那一层循环确认 break 所在的层次;如需结束外层,在外层也做相应判断

小结

  1. break 会立即终止它所在的整个循环,程序继续执行循环之后的代码。
  2. continue 只跳过当前循环体中剩余的语句,直接进入下一次迭代。
  3. 嵌套循环中,break 和 continue 都只对离它们最近的一层循环生效。
  4. 打印 1~20 的偶数时,break 让 10 及之后的偶数都不再输出;continue 只跳过 10 和 20,其余偶数照常输出。
  5. 在 while 循环中使用 continue 时,务必把改变循环条件的语句放在 continue 之前,避免死循环。
  6. for 循环的迭代变量会自动更新,因此在 for 中使用 continue 不需要额外移动更新语句。

📋 行动清单

  • 把本节 while 与 for 的 break 示例各运行一遍,确认输出中的 10 都没有被打印。
  • 把 continue 示例中的 i += 1 移到 continue 之后,观察死循环现象(可用 Ctrl+C 中断)。
  • 在“动手练一练”的代码中分别把固定值改成 3、7、4,观察 continue 与 break 的不同效果。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第2章代码包:break及continue(含1 个 Notebook)
    ZIP · 1KB
    下载