盯着条件的循环
for 遍历的是一个已知的序列,而 while 只要条件为真就会一直循环。事先不知道需要循环多少次时,就该用它:不断重试直到成功、一直读取输入直到用户喊停、反复轮询某个服务直到它响应。
结构很简单:
这会打印 0 到 4。Python 在每次循环开始时检查条件。如果为真,就执行循环体,然后再检查一次。当条件变为假时,循环结束。
注意 count += 1 很关键。没有它,条件会永远为真,形成死循环。这是 while 最主要的陷阱,也是能用 for 时优先用 for 的主要原因。
什么时候 while 是合适的工具
几个经典用法:
重试直到成功。
读取输入直到用户退出。
处理队列。
它们的共同点是:你在等待某个状态发生变化,而不是逐个遍历元素。
while True 没有问题
你会经常看到这种写法:
当“真正的”退出条件位于循环体内部,而不是能在开头干净地判断时,这就是地道的 Python 写法。它比另外造一个 should_continue 标志、在一处更新、在另一处检查更好读。
唯一的规则是:确保代码最终一定会执行到某个 break(或 return,或抛出异常)。一个没有任何出口的 while True:,是让程序卡死的经典方式。
避免死循环
当条件永远为真时,就会出现死循环。常见的原因有:
- 忘了更新变量。
while count < 5:需要循环体里有改变count的语句。 - 更新错了变量。 写的是
while i < 10:,循环体里却是j += 1。代码里变量一多,就很容易看漏。 - 浮点数比较。 如果
x只是无限接近 1.0,while x != 1.0:就可能永远循环下去。改用<=或abs(x - 1.0) < tolerance。
如果你在终端里陷入了死循环,按 Ctrl+C。这会发送一个中断信号,Python 会停止正在做的事情。
break、continue 和 else
while 支持和 for 一样的三种流程控制工具:
break立即退出循环。continue跳到下一次循环(因此会再次检查条件)。else在循环没有被break打断、正常结束时执行。
这是一个简单的质数判断。如果内部的 break 触发了,说明这个数是合数。如果循环自然结束(条件变为假),就执行 else,判定这个数是质数。
while 还是 for:该选哪个?
一个快速的判断方法:
- 有一个要逐个处理的集合吗? →
for。 - 需要循环固定的次数吗? →
for i in range(n):。 - 要一直循环到某个条件改变吗? →
while。
在入门阶段的 Python 代码中,你会发现 for 能覆盖 90% 的循环。while 出现在轮询、重试或编写简单的 REPL 等场景中。如果你在用 while 加索引来遍历列表,那就说明该换成 for + enumerate 了。
一个实用的 while 程序
猜数字游戏是个经典例子,因为循环次数取决于用户怎么玩:
你无法事先知道要猜几次,这取决于用户的猜测。这正是 while 存在的全部意义。
展望
现在你已经见过 Python 提供的两种循环了。接下来详细讲 range():几乎每个计数式的 for 循环都会用到它,在进入集合之前,值得先弄懂它的一些小细节。
常见问题
什么时候该用 while 循环而不是 for 循环?
事先不知道需要循环多少次时,用 while:比如不断重试直到成功,或者一直读取输入直到用户输入 'quit'。要逐个处理一个已知的集合时,用 for。
Python 中如何避免死循环?
确保循环内部有某个操作最终会让条件变为假。死循环最常见的原因,是忘了更新条件所依赖的变量。如果真的陷入了死循环,在终端中按 Ctrl+C 停止它。
while True 是不好的写法吗?
本身并不是。带有明确 break 的 while True:,是“一直循环,直到遇到某个特定退出条件”的完全正常的写法。它比另外造一个要在两处维护的布尔标志更简洁。