Menu

Python while 循环:语法、while True 与避免死循环

什么时候该用 while 循环而不是 for 循环,如何避免死循环,以及实际代码中最常见的写法。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

盯着条件的循环

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:,是“一直循环,直到遇到某个特定退出条件”的完全正常的写法。它比另外造一个要在两处维护的布尔标志更简洁。

Coddy 编程语言插图

和 Coddy 一起学编程

开始