查看全课大纲(第 20 / 51 节)
- 1.Python 是什么?为什么值得学?
- 2.如何为 Python 编程准备一个“全家桶”环境?
- 3.Python 有哪几种执行方法?
- 4.行与缩进到底有什么用?
- 5.注释有什么用,怎么写?
- 6.变量:如何给数据起个好名字?
- 7.运算符的优先级和常见坑点是什么?
- 8.Python 中,数字和布尔值究竟有哪几种?
- 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
- 10.如何将程序的结果展示给用户或保存下来?
- 11.CSV 文件怎么读怎么写才方便?
- 12.列表是什么,如何创建和访问它?
- 13.列表的修改操作,有哪些方法?
- 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
- 15.判断语句:如何让程序根据条件做不同的事?
- 16.for 循环如何遍历序列中的元素?
- 17.while 循环什么时候才会停?
- 18.while 循环的结束条件,你写对了吗?
- 19.循环中途想提前结束,怎么办?
- 20.`break` 和 `continue` 到底有什么区别?
- 21.列表推导式如何让代码更简洁高效?
- 22.字符串怎么定义、拼接和操作?
- 23.元组:为什么定义单个元素时要加逗号?
- 24.集合(set)怎么用?如何快速去重和做集合运算?
- 25.字典是什么,为什么比列表更方便?
- 26.字典的增删改查与遍历,如何避免 KeyError?
- 27.函数里的变量,为什么有的能用有的不能用?
- 28.在函数内部修改全局变量,为什么有时不生效?
- 29.函数里能修改全局变量吗?返回值怎么用?
- 30.匿名函数:如何用 lambda 快速定义简单函数?
- 31.面向对象编程是什么,为什么需要它?
- 32.类中的方法和属性到底怎么定义和使用?
- 33.如何控制对对象内部属性和方法的访问?
- 34.异常发生时,程序会怎样继续执行?
- 35.如何组织代码:包和模块
- 36.`if __name__ == '__main__'` 到底有什么用?
- 37.如何用 IDE 的 Debug 功能排查程序错误?
- 38.Matplotlib 绘图的第一步该做什么?
- 39.Figure 是什么,如何设置图形尺寸?
- 40.如何自定义 Matplotlib 的坐标轴?
- 41.如何为图表添加图例,让不同曲线一目了然?
- 42.饼图怎么画才能直观展示数据占比?
- 43.如何用 Matplotlib 绘制散点图?
- 44.柱状图怎么画?
- 45.如何使用 Matplotlib 绘制等高线图?
- 46.如何在 Matplotlib 中绘制子图?
- 47.zip 函数如何把多个列表“打包”在一起?
- 48.如何给可迭代对象加上索引?
- 49.random 模块如何生成随机数?
- 50.math 模块怎么用?
- 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 版本)执行过程:
i从 1 开始,2、4、6、8 是偶数且不是 10 的整数倍,依次被打印。- 当
i等于 10 时,它同时满足“偶数”和“10 的整数倍”,break被触发,整个循环立即结束。 break后面的print(i)不会执行,所以 10 本身也不会被打印;i += 1同样被跳过。- 程序跳出循环,执行循环之后的
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:continueprint(i)i += 1 | 程序在 i == 5 时卡住不动,陷入死循环 | continue 跳过了 i += 1,i 永远等于 5,循环条件永远成立 | 把 i += 1 放到 continue 之前执行 |
混淆 break 和 continue 的效果 | 想提前结束循环却只跳过了一次,或想跳过某次却把循环结束了 | 两个关键字的作用范围不同:一个结束整个循环,一个只结束本次 | break 用于终止整个循环;continue 用于跳过当前这一次,进入下一次 |
在嵌套循环中,以为 break 能跳出所有循环 | 内层结束后外层仍在继续,结果不符合预期 | break 只作用于离它最近的那一层循环 | 确认 break 所在的层次;如需结束外层,在外层也做相应判断 |
小结
break会立即终止它所在的整个循环,程序继续执行循环之后的代码。continue只跳过当前循环体中剩余的语句,直接进入下一次迭代。- 嵌套循环中,
break和continue都只对离它们最近的一层循环生效。 - 打印 1~20 的偶数时,
break让 10 及之后的偶数都不再输出;continue只跳过 10 和 20,其余偶数照常输出。 - 在
while循环中使用continue时,务必把改变循环条件的语句放在continue之前,避免死循环。 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