怎么跳出while循环|依靠break语句直接终止遍历
上周写爬虫脚本的时候卡了整整一下午,满脑子都是怎么跳出while循环,代码跑起来就卡死在死循环里,控制台滚动的日志根本停不下来,盯着屏幕敲了半小时修改代码,半点效果都没有。
一开始总想着靠修改循环内部的判断条件终止运行,给变量赋值归零,又额外加了多层if判断去限制循环启动,代码行数硬生生多出来二十多行,运行之后程序依旧会持续进入循环,数据采集的接口反复请求,直接触发了网站的访问限制。
折腾好久才搞明白,修改循环条件的思路本身就存在漏洞,while循环的判定逻辑会优先读取初始设定的循环条件,内部变量的数值改动很难同步覆盖底层判定规则,就算手动重置数值,循环也会多执行一轮完整逻辑再退出。
同事当时坐在旁边调试同款脚本,看见屏幕上跑死的程序,随手敲了一行break代码塞进判断分支里,原本无休止运行的循环,满足指定数据条件的瞬间直接停止运行。
断点调试的时候逐行运行代码,程序走到break所在代码行的瞬间,循环结构直接断开,不会继续往下读取循环内剩余的代码,也不会重新回到循环开头重新判定条件。
试过把break写在循环外层的代码块里,运行后没有任何作用,程序照样持续循环,才理清break只能放置在while循环的内部代码区间,依托if判断划定触发跳出的门槛,匹配到对应场景才会执行跳出指令。
当初还自作聪明搭配continue语句混用,想着先用continue跳过本轮循环,再依靠变量改动退出循环,两段代码叠加运行后,循环依旧不会停止,只会反复跳过部分采集逻辑,数据抓取的完整流程直接乱掉。
后续单独拆分代码测试,只保留基础while循环和内嵌的break判断,短短十几行代码就能稳定控制循环启停,不会出现死循环的问题,接口请求次数也能精准把控,不会无故触发网站风控机制。
下班收拾工位的时候,还反复回看那段调试记录,明明一行简单的break就能解决问题,偏要绕远路去修改循环初始条件,白白耗掉一下午的开发时间。