人人都能学编程
English 开始学习
课程 2 · Python 入门第 10 课 / 共 14 课免费阅读

while 循环 · Python 从零开始

事先不知道次数时,怎样一直循环到某件事发生?

课程目录

为什么需要它

「一直读数字,直到用户输入 0。」「钱一直翻倍,直到超过 1000。」你事先不知道要多少轮。机器人课里用过 while not at_goal(),现在你要用变量来写条件。

直觉理解

while 循环有三个部分,少一个就会出错:

  1. 准备:设置好条件里要用的变量。
  2. 检查:每一轮开始时检查条件。
  3. 改变:在循环体里修改变量,让条件最终能变成 False。
money = 100            # 1. 准备
years = 0
while money < 1000:    # 2. 检查
    money = money * 2  # 3. 改变
    years = years + 1
print(years)

一直读输入直到遇到结束值,是很经典的写法:循环之前先读一次,每一轮的最后再读一次。

定义

循环条件 Loop condition

The loop condition of a while loop is evaluated before each iteration; the loop stops when it becomes False.
while 循环的循环条件在每次迭代前计算;它变成 False 时循环停止。

结束标记 Sentinel value

A sentinel value is a special input, such as 0, that signals the end of the data.
结束标记是一个特殊的输入值(比如 0),表示数据到此结束。

示例

100 要翻倍几次才超过 1000?

money = 100
years = 0
while money < 1000:
    money = money * 2
    years = years + 1
print(years, money)
逐步执行
  1. L3100 < 1000:True,进入循环。money = 100
  2. L4翻倍:200。years = 1。money = 200, years = 1
  3. L4400(2)、800(3)、1600(4)……money = 1600, years = 4
  4. L31600 < 1000:False,循环结束。
  5. L6循环后打印一次。4 1600

求和直到 0

动手试试

改一改「输入」框:随便几个数,最后以 0 结尾。

total = 0
n = int(input())
while n != 0:
    total = total + n
    n = int(input())
print(total)
输入(每次 input() 读一行)
5
8
2
0
逐步执行
  1. L2循环之前先读第一个数。n = 5
  2. L35 != 0,所以把它加上。total = 5
  3. L5在这一轮的最后读下一个数。n = 8
  4. L3……读到 0 时条件为 False,循环停止。total = 15

常见错误

忘了修改变量

如果循环体最后没有 n = int(input()),n 永远不变,循环就停不下来。这个网站会在几秒后把它停掉。

用 for 还是 while?

知道要几轮(或者手里有一个序列)?用 for。要等某个条件?用 while。

小测验

1. 这段代码会输出什么?

n = 1
while n < 20:
    n = n * 3
print(n)
  1. A
    27
  2. B
    9
  3. C
    20
查看答案

答案:A

1 → 3 → 9 → 27。27 < 20 为 False,循环在 27 停下。

2. 这段代码会输出什么?

i = 5
while i > 0:
    i = i - 2
print(i)
  1. A
    -1
  2. B
    1
  3. C
    0
查看答案

答案:A

5 → 3 → 1 → -1。只在每一轮开始时检查条件。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出折半

    准确写出程序的输出。

  2. 改需求顺便数一数

    这段程序一直加到读到 0 为止。在第二行再打印一共加了几个数(0 不算)。

  3. 从零写考拉兹步数

    读入一个正整数 n。重复下面的操作直到 n 变成 1:n 是偶数就变成 n // 2,否则变成 3 × n + 1。打印一共用了几步。(6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1,是 8 步。)

在互动课里练这一课

打开互动课,这些例子都能直接改、直接运行,练习题提交马上判题。免费开始,不用注册。

互动课按顺序解锁:前面的课还没学,会先带你到课程地图。

本课术语

术语中文英文定义
Loop condition循环条件The expression a while loop checks before each round.
Sentinel value结束标记A special input value that marks the end of the data.
Counter计数器A variable that is increased by 1 each time something happens.