while 循环 · Python 从零开始
事先不知道次数时,怎样一直循环到某件事发生?
课程目录为什么需要它
「一直读数字,直到用户输入 0。」「钱一直翻倍,直到超过 1000。」你事先不知道要多少轮。机器人课里用过 while not at_goal(),现在你要用变量来写条件。
直觉理解
while 循环有三个部分,少一个就会出错:
- 准备:设置好条件里要用的变量。
- 检查:每一轮开始时检查条件。
- 改变:在循环体里修改变量,让条件最终能变成 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)逐步执行
- L3100 < 1000:True,进入循环。
money = 100 - L4翻倍:200。years = 1。
money = 200, years = 1 - L4400(2)、800(3)、1600(4)……
money = 1600, years = 4 - L31600 < 1000:False,循环结束。
- 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
逐步执行
- L2循环之前先读第一个数。
n = 5 - L35 != 0,所以把它加上。
total = 5 - L5在这一轮的最后读下一个数。
n = 8 - L3……读到 0 时条件为 False,循环停止。
total = 15
常见错误
忘了修改变量
如果循环体最后没有 n = int(input()),n 永远不变,循环就停不下来。这个网站会在几秒后把它停掉。
用 for 还是 while?
知道要几轮(或者手里有一个序列)?用 for。要等某个条件?用 while。
小测验
1. 这段代码会输出什么?
n = 1
while n < 20:
n = n * 3
print(n)查看答案
答案:A
1 → 3 → 9 → 27。27 < 20 为 False,循环在 27 停下。
2. 这段代码会输出什么?
i = 5
while i > 0:
i = i - 2
print(i)查看答案
答案:A
5 → 3 → 1 → -1。只在每一轮开始时检查条件。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出折半
准确写出程序的输出。
- 改需求顺便数一数
这段程序一直加到读到 0 为止。在第二行再打印一共加了几个数(0 不算)。
- 从零写考拉兹步数
读入一个正整数 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. |