讲解

while 循环只有条件部分:while 条件: 条件为真就一直执行循环体。它适合「不知道要循环多少次,只知道什么时候停」的场景——比如不断读取输入直到用户说退出、反复逼近一个数值答案、轮询直到状态就绪。循环体内可以用 break 立即跳出整个循环,用 continue 跳过本轮直接进入下一轮。

while 最大的风险是死循环:条件永远为真,程序卡死。防御方法有三个:确保循环体内有让条件趋向不成立的更新语句;给循环加最大轮数兜底,超过阈值就 break;写完先自问「退出条件一定会发生吗」。一个健康的 while 循环,循环体里必然有改变条件所依赖状态的语句。

Python 的 while 还有一个冷门的 else 子句:循环「正常结束」(条件变假)时执行 else 块,被 break 打断则不执行。它常用于「找东西」的场景:循环里找到就 break,else 里处理「没找到」。另外 while True: 配合 break 是「先执行再判断」的标准写法(Python 没有 do...while),常见于交互式菜单。和海象运算符配合,读取-判断循环可以写得很紧凑:while (line := next_line()) != '':。

示例

# 次数未知的典型场景:二分逼近平方根
def sqrt_approx(n):
    low, high = 0.0, float(n)
    while high - low > 0.0001:
        mid = (low + high) / 2
        if mid * mid > n:
            high = mid
        else:
            low = mid
    return (low + high) / 2


print('根号 2 约等于', sqrt_approx(2))

# while True + break:至少执行一次的「菜单」骨架
attempts = 0
while True:
    attempts += 1
    print(f'第 {attempts} 次尝试')
    if attempts >= 3:  # 真实程序里这里判断用户是否输入「退出」
        break

# 最大轮数兜底,防死循环
value = 100
rounds = 0
while value > 1:
    value //= 3
    rounds += 1
    if rounds > 1000:
        print('超过最大轮数,强制退出')
        break
print(f'100 不断整除 3,{rounds} 轮后得到 {value}')

# while...else:找东西,找到 break,没找到走 else
targets = [3, 5, 8, 13]
i = 0
while i < len(targets):
    if targets[i] == 7:
        print('找到了 7')
        break
    i += 1
else:
    print('列表里没有 7')

常见坑

  • 循环体里忘记更新状态:while i < 10: 里面少了 i += 1 就是死循环,终端只能 Ctrl+C 杀掉。
  • 用浮点相等做退出条件:小数累加很难精确等于目标值,退出条件用范围比较(差值小于精度)而不是 ==。
  • break 只跳一层:嵌套循环里 break 只跳出当前所在的那层。想一次跳多层,通常重构为函数后用 return。
  • 能用 for 就别用 while:遍历列表用 for 一行搞定,手写 while + 下标 + len 是给自己找麻烦(下一节就讲 for)。

小结

while 处理「条件驱动」的循环,循环体必须推进退出条件;break 跳出、continue 跳过、else 处理「没找到」;while True + break 实现至少一次。下一节看更常用的 for 循环。