Python while 循环,我以为我懂了,直到踩了这些坑

发布时间:2026/7/16 3:31:23
Python while 循环,我以为我懂了,直到踩了这些坑 循环十分钟debug两小时。先坦白一件事我写 Python 好几年了但去年还在因为 while 循环翻车。不是语法不懂是脑子里的执行模型和实际运行对不上。挺丢人的但我觉得很多人跟我一样——觉得 while 太简单了就不屑于认真琢磨它。while 长什么样不用我多说了吧pythonwhile condition: # 干点啥就这。条件为 True 就进去为 False 就跳过。但 Python 给 while 加了个小尾巴别的语言没有pythonwhile condition: # 循环体 else: # 循环没被 break 打断的话来这里这个else我第一次见的时候觉得莫名其妙后来发现某些场景下真挺好用后面细说。我在项目里怎么用 while说实话工作中 while 用得不算多但每次用都是不得不用的场景。最常碰到的用户输入校验写小工具的时候经常要跟用户交互用户输错了就一直问直到输对为止pythonwhile True: age input(你多大了) if age.isdigit() and 0 int(age) 150: print(f好{age}岁) break print(重新输别乱填)这块没什么技术含量就是写起来顺手。另一个常见场景重试调第三方接口的时候网络抖一下超时了总不能直接报错让用户重试吧一般会加个重试逻辑pythonretry 0 while retry 3: try: data requests.get(url, timeout5) break except: retry 1 time.sleep(2 ** retry) # 等2秒、4秒、8秒 else: raise Exception(三次都失败了放弃)这个else就派上用场了——三次重试全挂走 else 报错。我觉得比设个 flag 变量清爽。有件事我一直想吐槽Python 没有 do-while。有时候我就想让循环体先跑一次再判断条件。比如展示菜单text1. 新建 2. 打开 3. 退出用户选完执行执行完再展示菜单。菜单总得先展示一次吧没有 do-while就只能这么写pythonwhile True: show_menu() choice input(选一个) if choice 3: break handle(choice)倒也能用就是总觉得不够优雅。不过习惯就好Python 社区的人好像也不怎么在乎这个。while-else 我用了半年才习惯刚知道 while-else 的时候我觉得这什么鬼设计谁会记得还有个 else 啊后来写了个查找素数的函数pythonn 17 i 2 while i * i n: if n % i 0: print(f{n} 能被 {i} 整除) break i 1 else: print(f{n} 是素数)突然觉得还挺自然的。如果循环正常跑完了没 break那就进 else——相当于没找到的兜底逻辑。不过说实话这写法也就自己写着爽。团队项目里我不敢这么写怕同事看不懂宁愿写成pythonfound False while ...: if ...: found True break if not found: print(没找到)可读性第一炫技害人。我踩过的坑希望你不用再踩坑一条件不变死循环这个太经典了谁还没忘写过i呢pythoni 0 while i 10: print(i) # 忘写 i 1终端疯狂输出 0CPU 呼呼转。我现在养成了习惯写 while 的第一时间先写退出条件的更新语句再写业务逻辑。坑二字符串跟整数比pythonwhile True: num input(输入数字) if num 0: # 完蛋 breakinput()返回的是字符串0跟0永远不相等。这种 bug 特别隐蔽因为肉眼看起来 0 和 0 差不多。我后来统一用int()转一下或者直接跟字符串比。坑三浮点数累加有次我想让程序从 0 累加到 1步长 0.1pythonx 0.0 while x ! 1.0: x 0.1然后它就没完没了了。浮点数精度问题0.10.1... 永远不等于 1.0。从此我只要看到 while 条件里有浮点数就条件反射用或绝对不用或!。什么时候用 while什么时候用 forPython 社区的主流观点是能用 for 就别用 while我基本认同。遍历列表、字符串、字典用 for 就完了代码短可读性高pythonfor item in items: print(item)但有些场景 for 真搞不定比如我需要无限循环直到某个事件发生我需要手动控制游标不是每次都1可能跳着走我要做一个生产者消费者模型循环跑在后台这时候 while 就是唯一的选择。性能方面while 在 Python 里比 for 慢那么一丢丢但绝大多数场景感受不到。别为了这点性能牺牲可读性除非你在写高频交易系统。一个小技巧用 while 处理列表我偶尔会用这种方式清空列表pythontasks [1, 2, 3, 4, 5] while tasks: task tasks.pop() process(task)while tasks的意思是列表不为空就继续每次 pop 一个列表越来越短直到空列表变成 False循环结束。这个写法挺 Pythonic 的但第一次看到的人可能会懵。注释写清楚就好。最后说两句while 循环这东西语法三分钟学会但真正写好需要点经验积累。我现在的习惯是写 while 之前先确认退出条件是什么循环体里一定要有改变条件的操作无限循环用while Truebreak别搞花哨的写法while-else自己用可以团队项目慎用说到底代码是给人看的顺便让机器跑一下。while 再灵活也不如让别人一眼看懂重要。你们有没有因为 while 出过什么奇怪的 bug评论区聊聊让我知道自己不是一个人。