查看全课大纲(第 17 / 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 如何快速统计元素出现次数?
while 循环什么时候才会停?
约 7 分钟
小象实战讲义 · Python 编程从入门到实践
在上一节我们学习了用 for 循环来遍历序列,实现重复执行。但有时,我们并不知道要重复多少次,只知道“当某个条件满足时,就继续执行”。这时,就需要 while 循环。本节将讲解 while 循环的语法、执行流程、与 for 循环的区别,并通过嵌套循环的例子来加深理解。
💡 核心导读
while循环的基本语法:while 条件:,条件为真则执行循环体。- 执行流程:先判断条件,再执行循环体,执行完再回到条件判断,直到条件为假才退出。
while与for的选择:for常用于遍历已知序列,while更适合条件驱动的未知次数循环。- 循环嵌套:在
while循环内部可以再使用while循环,实现更复杂的逻辑。 - 避免无限循环:确保循环体内有改变循环条件的语句,否则循环可能永不停止。
while 循环是什么?
while 循环是 Python 中实现循环执行的另一种方式。它的核心是条件判断:只要给定的条件为真(True),就会反复执行循环体内的代码块。
while 判断条件:
条件满足时,执行的语句块它的执行流程可以概括为:
- 判断
while后面的条件表达式。 - 如果条件为
True,则执行一次循环体内的所有语句。 - 执行完毕后,再次回到第 1 步,重新判断条件。
- 如果条件变为
False,则跳过整个循环体,继续执行后面的代码。
这个过程就像一个“哨兵”,只要条件成立就放行执行循环体,条件不成立就结束站岗。
while 循环怎么用?
基础示例:打印数字
下面是一个简单的例子,打印数字 0 到 9。
# 示例:使用 while 循环打印 0 到 9
i = 0 # 初始化一个计数器
while i < 10: # 条件:i 小于 10
print(i)
i += 1 # 在循环体内改变 i 的值,这是让循环最终能停下来的关键0
1
2
3
4
5
6
7
8
9关键点:循环体内 i += 1 这一行至关重要。它每次循环都将 i 的值增加 1,使得 i 最终会等于 10,条件 i < 10 不再成立,循环因此终止。如果缺少这行,i 将永远是 0,条件永远为真,程序就会陷入无限循环。
while 与 for 的对比
while 循环和 for 循环都能实现重复执行,很多时候可以互相替代。例如,上面的例子用 for 循环写更简洁:
# 使用 for 循环实现相同功能
for i in range(10):
print(i)0
1
2
3
4
5
6
7
8
9那么如何选择呢?一个简单的区分原则是:
for循环:当你明确知道要循环的次数,或者需要遍历一个已知的序列(如列表、range对象)中的每一个元素时,使用for循环更直观。while循环:当你不确定要循环多少次,循环的结束取决于某个动态条件是否被满足时,使用while循环更合适。例如判断a < 3这类条件时,while不需要另外准备一个列表或字典作为遍历对象。
循环嵌套:while 套 while
和 for 循环一样,while 循环也可以嵌套使用。外层循环每执行一次,内层循环都会完整地执行一遍。
示例:绘制杨辉三角形
杨辉三角形是一个经典的数学图形,其特点是:
- 第 1 层是
[1]。 - 每一层的左右两端都是
1。 - 中间的任何数字,等于其“左上方”和“右上方”两个数字之和。
我们可以用两层 while 循环来生成和打印它。外层循环控制层数,内层循环负责计算和打印当前层的数字。
下面的代码实现了这个功能。为了在讲义中可运行,我们将原本需要用户输入高度的 input() 替换为一个固定值 5。
# 示例:使用 while 循环嵌套绘制杨辉三角形(高度为5层)
n = 5 # 三角形高度,原程序使用 input() 输入
layer = 1 # 当前层数,从第1层开始
values = [1] # 存储当前层的数值,初始为第一层 [1]
while layer <= n: # 外层循环:控制层数,画完 n 层为止
new_values = [1] # 初始化下一层的列表,最左边是1
index = 0
# 内层循环:遍历当前层 values,打印并计算下一层中间的数
while index < len(values):
print('%d ' % values[index], end='') # 打印当前数字
# 如果不是最后一个数,计算它与下一个数的和,放入下一层
if index < len(values) - 1:
new_values.append(values[index] + values[index + 1])
index += 1 # 索引加1,处理下一个数
new_values.append(1) # 下一层最右边也是1
values = new_values # 更新当前层为下一层,为绘制下一层做准备
print('') # 换行,准备打印下一层
layer += 1 # 层数加11
1 1
1 2 1
1 3 3 1
1 4 6 4 1 代码逻辑解析:
values列表始终保存着当前正在打印的这一层的所有数字。- 内层
while循环做两件事:- 打印:打印
values中的每一个数字。 - 计算:将
values中相邻两个数字相加,得到的结果存入new_values,这将是下一层中间部分的数字。
- 打印:打印
- 内层循环结束后,为
new_values补上最右边的1,然后让values = new_values,这样下一轮外层循环时,打印和计算的就是新的一层了。 - 外层循环的
layer每次加 1,直到达到指定的高度n。
📝 动手练一练
请尝试修改上面绘制杨辉三角形的代码,使其能够打印出高度为 8 层的杨辉三角形,并观察输出结果。
👉 点击查看参考答案
思路:只需要将控制三角形高度的变量 n 的值从 5 改为 8 即可。
n = 8 # 将三角形高度改为8层
layer = 1
values = [1]
while layer <= n:
new_values = [1]
index = 0
while index < len(values):
print('%d ' % values[index], end='')
if index < len(values) - 1:
new_values.append(values[index] + values[index + 1])
index += 1
new_values.append(1)
values = new_values
print('')
layer += 11
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1 常见错误
| 错误写法 | 现象或报错 | 原因 | 正确写法 |
|---|---|---|---|
while i < 5:print(i)i += 1 | IndentationError: expected an indented block after 'while' statement on line 1 | while 语句后的冒号 : 表示接下来是一个代码块,必须缩进。print(i) 没有缩进,Python 认为循环体为空。 | while i < 5:print(i)i += 1 |
i = 0while i < 5:print(i) | 程序陷入无限循环,不断打印 0。 | 循环条件 i < 5 始终为真,因为循环体内没有改变 i 的值的语句。必须在循环体内修改条件变量。 | i = 0while i < 5:print(i)i += 1 |
while i < 5print(i)i += 1 | SyntaxError: expected ':' | while 语句末尾缺少冒号 :,Python 无法识别这是一个循环语句。 | while i < 5:print(i)i += 1 |
小结
while循环用于在条件为真时重复执行一段代码,语法为while 条件:。- 执行流程是“判断-执行-再判断”,直到条件为假才退出。
- 与
for循环相比,while更适合循环次数不确定、由条件驱动的场景。 - 循环可以嵌套,内层循环作为外层循环体的一部分,会完整执行多次。
- 使用
while循环时,务必确保循环体内有改变循环条件的语句,否则极易导致无限循环。
📋 行动清单
- 将本节第一个
while循环示例中的i < 10改为i <= 10,观察输出有何不同。 - 尝试用
for循环改写“绘制杨辉三角形”的代码,思考哪种写法对你来说更清晰。 - 故意写一个缺少条件变更语句的
while循环(如while True: print('loop')),运行它,然后使用键盘快捷键Ctrl+C来强制终止程序,感受一下无限循环。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第2章代码包:while循环(含1 个 Notebook)ZIP · 732B