查看全课大纲(第 17 / 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 如何快速统计元素出现次数?

while 循环什么时候才会停?

约 7 分钟

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

在上一节我们学习了用 for 循环来遍历序列,实现重复执行。但有时,我们并不知道要重复多少次,只知道“当某个条件满足时,就继续执行”。这时,就需要 while 循环。本节将讲解 while 循环的语法、执行流程、与 for 循环的区别,并通过嵌套循环的例子来加深理解。

💡 核心导读

  • while 循环的基本语法:while 条件:,条件为真则执行循环体。
  • 执行流程:先判断条件,再执行循环体,执行完再回到条件判断,直到条件为假才退出。
  • while 与 for 的选择:for 常用于遍历已知序列,while 更适合条件驱动的未知次数循环。
  • 循环嵌套:在 while 循环内部可以再使用 while 循环,实现更复杂的逻辑。
  • 避免无限循环:确保循环体内有改变循环条件的语句,否则循环可能永不停止。

while 循环是什么?

while 循环是 Python 中实现循环执行的另一种方式。它的核心是条件判断:只要给定的条件为真(True),就会反复执行循环体内的代码块。

while 判断条件:
    条件满足时,执行的语句块

它的执行流程可以概括为:

  1. 判断 while 后面的条件表达式。
  2. 如果条件为 True,则执行一次循环体内的所有语句。
  3. 执行完毕后,再次回到第 1 步,重新判断条件。
  4. 如果条件变为 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]。
  2. 每一层的左右两端都是 1。
  3. 中间的任何数字,等于其“左上方”和“右上方”两个数字之和。

我们可以用两层 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  # 层数加1
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 

代码逻辑解析:

  • values 列表始终保存着当前正在打印的这一层的所有数字。
  • 内层 while 循环做两件事:
    1. 打印:打印 values 中的每一个数字。
    2. 计算:将 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 += 1
1 
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 1while 语句后的冒号 : 表示接下来是一个代码块,必须缩进。print(i) 没有缩进,Python 认为循环体为空。while i < 5:
print(i)
i += 1
i = 0
while i < 5:
print(i)
程序陷入无限循环,不断打印 0。循环条件 i < 5 始终为真,因为循环体内没有改变 i 的值的语句。必须在循环体内修改条件变量。i = 0
while i < 5:
print(i)
i += 1
while i < 5
print(i)
i += 1
SyntaxError: expected ':'while 语句末尾缺少冒号 :,Python 无法识别这是一个循环语句。while i < 5:
print(i)
i += 1

小结

  1. while 循环用于在条件为真时重复执行一段代码,语法为 while 条件:。
  2. 执行流程是“判断-执行-再判断”,直到条件为假才退出。
  3. 与 for 循环相比,while 更适合循环次数不确定、由条件驱动的场景。
  4. 循环可以嵌套,内层循环作为外层循环体的一部分,会完整执行多次。
  5. 使用 while 循环时,务必确保循环体内有改变循环条件的语句,否则极易导致无限循环。

📋 行动清单

  • 将本节第一个 while 循环示例中的 i < 10 改为 i <= 10,观察输出有何不同。
  • 尝试用 for 循环改写“绘制杨辉三角形”的代码,思考哪种写法对你来说更清晰。
  • 故意写一个缺少条件变更语句的 while 循环(如 while True: print('loop')),运行它,然后使用键盘快捷键 Ctrl+C 来强制终止程序,感受一下无限循环。

—— 小象教研组

配套资料 · 直接下载

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

  • 第2章代码包:while循环(含1 个 Notebook)
    ZIP · 732B
    下载