Kodewick
第 14 课,共 31 课目录

while 循环

第 14 课,共 31 课 · 第 2 部分 · 容器和循环 · 约 20 分钟

for 循环走的是一串现成的东西。while 循环不一样:只要条件还是真的,它就一直跑下去,要跑多少圈就跑多少圈。事先不知道要重复几次的时候,就用它。

main.py
1oil = 32while oil > 0:3    print(f"灯亮着,还剩油:{oil}")4    oil -= 15print("灯灭了")
输出
灯亮着,还剩油:3
灯亮着,还剩油:2
灯亮着,还剩油:1
灯灭了

while 循环是怎么跑的

每一圈开始前,Python 先看 while 后面的条件。是真的,就跑一遍缩进的循环体,然后回到上面再看一次。条件一变成假的,循环就结束,接着跑下面的代码。

  1. oil > 0 吗?3 > 0,是:显示,oil 变成 2。
  2. 2 > 0,是:显示,oil 变成 1。
  3. 1 > 0,是:显示,oil 变成 0。
  4. 0 > 0,不是:循环结束。

小技巧: 在上面的例子上点单步。能看到每跑完一圈,Python 都跳回 while 那一行,oil 一点一点往下减。

先猜一猜

这段会显示什么?

1n = 12while n < 100:3    n = n * 24print(n)

一直做到某件事发生

「要运几趟,仓库里才有 20 块矿石?」这种问题正适合 while。用 range() 不好写,但什么时候该停是说得清的。

main.py
1stored = 02trips = 03while stored < 20:4    stored += 65    trips += 16    print(f"第 {trips} 趟,仓库里有:{stored}")7print("一共运了", trips, "趟")
输出
第 1 趟,仓库里有:6
第 2 趟,仓库里有:12
第 3 趟,仓库里有:18
第 4 趟,仓库里有:24
一共运了 4 趟

死循环

条件要是永远不变成假的,循环就永远停不下来,这叫死循环。最常见的原因是忘了改条件里用到的那个变量:

代码哪里不对
while count <= 3:,循环里没有 count += 1count 一直不变,条件一直是真的。
while lamps > 0:,循环里写的是 lamps += 1lamps 往反方向走,永远到不了 0。
while True:,里面没有 breakTrue 永远是真的。

卡在死循环里的程序,要么一遍遍显示同样的东西,要么像是卡住了不动。在这个网站上,程序跑的步数太多时,引擎会把它停下。在自己电脑上,在终端里按 Ctrl+C 就能停。遇到死循环,先看什么能让条件变成假的,再确认循环体真的会走到那一步。

while True 加 break

有时候该停的时机在一圈的中间,而不是开头。这时就写 while True:,一个本来会永远跑下去的循环,再用 break 跳出来。这个 break 和 for 里的是同一个。

main.py
1n = 12while True:3    n = n * 34    if n > 50:5        break6    print(n)7print("停在", n)
输出
3
9
27
停在 81

这里 break 是唯一的出口,所以一定要保证某一圈真的会走到它。

用 continue 跳过

continue 直接跳回条件那里,开始下一圈。这里每逢 3 的倍数就跳过:

main.py
1n = 02while n < 7:3    n += 14    if n % 3 == 0:5        continue6    print(n)
输出
1
2
4
5
7

注意 n += 1 写在 continue 前面。要是写在后面,被跳过的那一圈就改不了 n,循环会一直卡在同一个数上。

一直问到输入对为止

用户输入的东西不能用,就再问一遍,直到能用为止,这是 while True 最经典的用法。这里依次输入了 ten、0、4:

main.py
1while True:2    text = input("要点几盏灯?")3    if not text.isdigit():4        print("请输入一个数字。")5        continue6    lamps = int(text)7    if lamps == 0:8        print("至少一盏。")9        continue10    break11print("点亮", lamps, "盏灯")
输出
要点几盏灯?ten
请输入一个数字。
要点几盏灯?0
至少一盏。
要点几盏灯?4
点亮 4 盏灯

每个不对的回答都会得到一句提示,再 continue 重新问。只有对的回答才走得到 break。isdigit() 在文字全是数字时是真的,所以 int(text) 不会出错。

猜数字

合起来做一个小游戏:一直让人猜,每次给个提示,猜对了就停。

main.py
1secret = 72tries = 03while True:4    guess = int(input("你猜:"))5    tries += 16    if guess < secret:7        print("小了")8    elif guess > secret:9        print("大了")10    else:11        print(f"猜对了,用了 {tries} 次!")12        break
输出
你猜:4
小了
你猜:9
大了
你猜:7
猜对了,用了 3 次!

真正的游戏会用 random 模块每次换一个秘密数字,后面的课会讲。这里先把它定死,例子每次跑出来都一样。改改 secret 和输入的答案,自己试试。

用 for 还是 while?

用什么时候例子
for东西是现成的,或者知道要跑几圈一条街上的每栋房子;跑 10 遍
while等某件事发生才停直到仓库满了;直到输入对了

for 能做的,while 都能做,只是计数要自己管。下面两段显示的一样:

main.py
1for i in range(3):2    print("for", i)3i = 04while i < 3:5    print("while", i)6    i += 1
输出
for 0
for 1
for 2
while 0
while 1
while 2

两种都行的时候,优先用 for:更短,也不会一不小心变成死循环。

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。循环停不下来,就看看什么本该让条件变成假的。

练习 1

翻倍

从 1 开始,只要 n 小于 1000 就一直翻倍,用 steps 数一共翻了几次。

要显示
翻了 10 次:1024
exercise1.py
1n = 12steps = 03# 在这里写循环4print(f"翻了 {steps} 次:{n}")
输出
点「运行」或按 Ctrl+Enter
练习 2

最后一盏灯

这个循环应该点亮 1 到 5 号灯,可是少点了一盏。改好它。

要显示
灯 1
灯 2
灯 3
灯 4
灯 5
exercise2.py
1count = 12while count < 5:3    print("灯", count)4    count += 1
输出
点「运行」或按 Ctrl+Enter
练习 3

各位数字相加

用 while 循环把 n 的各位数字加起来:2024 就是 2 + 0 + 2 + 4。

要显示
8
exercise3.py
1n = 20242total = 03# 在这里写循环4print(total)
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • while 条件: 只要条件是真的就重复循环体;每圈开始前检查一次。
  • 要等某件事发生才停,而不是跑固定几圈,就用 while。
  • 条件永远不变成假的,就是死循环:确保循环体会改变条件检查的东西。
  • while True: 加 break 可以在一圈中间停下;continue 直接开始下一圈。
  • 合起来,就能一直问到输入对为止,也能做猜数字游戏。