while 循环
for 循环走的是一串现成的东西。while 循环不一样:只要条件还是真的,它就一直跑下去,要跑多少圈就跑多少圈。事先不知道要重复几次的时候,就用它。
1oil = 32while oil > 0:3 print(f"灯亮着,还剩油:{oil}")4 oil -= 15print("灯灭了")
灯亮着,还剩油:3 灯亮着,还剩油:2 灯亮着,还剩油:1 灯灭了
while 循环是怎么跑的
每一圈开始前,Python 先看 while 后面的条件。是真的,就跑一遍缩进的循环体,然后回到上面再看一次。条件一变成假的,循环就结束,接着跑下面的代码。
oil > 0吗?3 > 0,是:显示,oil变成 2。- 2 > 0,是:显示,
oil变成 1。 - 1 > 0,是:显示,
oil变成 0。 - 0 > 0,不是:循环结束。
小技巧: 在上面的例子上点单步。能看到每跑完一圈,Python 都跳回 while 那一行,oil 一点一点往下减。
这段会显示什么?
1n = 12while n < 100:3 n = n * 24print(n)
n 一直翻倍:2、4、8、16、32、64。64 还小于 100,所以还要再跑一圈,n 变成 128,这时条件才是假的。条件只在每圈开头检查,不会在一圈中间检查。
一直做到某件事发生
「要运几趟,仓库里才有 20 块矿石?」这种问题正适合 while。用 range() 不好写,但什么时候该停是说得清的。
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 += 1 | count 一直不变,条件一直是真的。 |
while lamps > 0:,循环里写的是 lamps += 1 | lamps 往反方向走,永远到不了 0。 |
while True:,里面没有 break | True 永远是真的。 |
卡在死循环里的程序,要么一遍遍显示同样的东西,要么像是卡住了不动。在这个网站上,程序跑的步数太多时,引擎会把它停下。在自己电脑上,在终端里按 Ctrl+C 就能停。遇到死循环,先看什么能让条件变成假的,再确认循环体真的会走到那一步。
while True 加 break
有时候该停的时机在一圈的中间,而不是开头。这时就写 while True:,一个本来会永远跑下去的循环,再用 break 跳出来。这个 break 和 for 里的是同一个。
1n = 12while True:3 n = n * 34 if n > 50:5 break6 print(n)7print("停在", n)
3 9 27 停在 81
这里 break 是唯一的出口,所以一定要保证某一圈真的会走到它。
用 continue 跳过
continue 直接跳回条件那里,开始下一圈。这里每逢 3 的倍数就跳过:
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:
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) 不会出错。
猜数字
合起来做一个小游戏:一直让人猜,每次给个提示,猜对了就停。
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 都能做,只是计数要自己管。下面两段显示的一样:
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 开始,只要 n 小于 1000 就一直翻倍,用 steps 数一共翻了几次。
翻了 10 次:1024
1n = 12steps = 03# 在这里写循环4print(f"翻了 {steps} 次:{n}")
最后一盏灯
✓这个循环应该点亮 1 到 5 号灯,可是少点了一盏。改好它。
灯 1 灯 2 灯 3 灯 4 灯 5
1count = 12while count < 5:3 print("灯", count)4 count += 1
各位数字相加
✓用 while 循环把 n 的各位数字加起来:2024 就是 2 + 0 + 2 + 4。
8
1n = 20242total = 03# 在这里写循环4print(total)
这一课学会了
while 条件:只要条件是真的就重复循环体;每圈开始前检查一次。- 要等某件事发生才停,而不是跑固定几圈,就用
while。 - 条件永远不变成假的,就是死循环:确保循环体会改变条件检查的东西。
while True:加break可以在一圈中间停下;continue直接开始下一圈。- 合起来,就能一直问到输入对为止,也能做猜数字游戏。