讲解
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 循环。