010、Python流程控制:循环结构(for/while)

张开发
2026/4/13 21:23:04 15 分钟阅读

分享文章

010、Python流程控制:循环结构(for/while)
010、Python流程控制循环结构for/while上周实习生小张跑来找我说他的脚本跑了半小时还没出结果。我过去一看代码里有个while True但条件变量在嵌套的三层if里才更新稍不注意就死循环了。这种问题在初学者里太常见了今天咱们就彻底把Python的循环结构捋清楚。循环的本质让机器替你重复劳动写程序最忌讳的就是重复代码。比如要打印100次“Hello World”难道真写100行print这时候循环就派上用场了。Python提供了两种循环方式for和while它们看着简单但用错了地方就会埋下隐患。for循环知道要跑多少圈时用它for循环最适合处理已知迭代次数或遍历集合的场景。它的结构很直观# 遍历列表是最常见的用法tools[编辑器,解释器,调试器]fortoolintools:print(f正在准备{tool})# 这里会自动换行如果不想换行可以加end参数# 需要索引时别用range(len())这种写法试试enumerateforidx,toolinenumerate(tools,start1):# start参数让索引从1开始print(f第{idx}个工具是{tool})遍历字典时很多人会踩坑config{port:8080,host:localhost,debug:True}# 这样只能拿到keyforkeyinconfig:print(key)# 输出port, host, debug# 要同时拿到key和valueforkey,valueinconfig.items():# items()返回的是(key, value)对print(f{key}设置为{value})# 只要value也行forvalueinconfig.values():print(value)range()函数是for循环的好搭档但注意它的三个参数foriinrange(5):# 0到4共5次print(i)foriinrange(2,10,2):# 从2开始到10之前步长为2print(i)# 输出2,4,6,8# 倒序循环这么写foriinrange(5,0,-1):# 从5到1print(i)while循环条件满足就一直跑当循环次数不确定需要根据条件判断时while就派上用场了# 简单的计数器count0whilecount5:print(f这是第{count1}次尝试)count1# 千万别忘了这行不然就是死循环# 处理用户输入user_inputwhileuser_input.lower()!quit:# 忽略大小写user_inputinput(输入命令输入quit退出: )print(f执行:{user_input})while True配合break是常见的模式但要注意退出条件的位置whileTrue:datafetch_data()# 假设这是个获取数据的函数ifnotdata:# 没有数据就退出breakifdataerror:# 遇到错误也退出breakprocess_data(data)# 处理数据# 这样写比在while条件里写复杂判断更清晰循环控制break、continue和else这三个关键字能让循环更灵活# break直接跳出整个循环foriinrange(10):ifi5:print(遇到5提前结束)break# 循环到此为止print(i)# continue跳过本次循环的剩余部分foriinrange(5):ifi2:print(跳过2)continue# 下面的print不会执行print(i)# else循环正常结束才执行没被break打断foriinrange(3):print(i)else:print(循环正常结束)# 会执行foriinrange(3):ifi1:breakprint(i)else:print(这行不会执行)# 因为循环被break打断了嵌套循环与性能陷阱多层循环嵌套时要注意性能# 三层嵌套时间复杂度O(n³)数据量大时很慢foriinrange(100):forjinrange(100):forkinrange(100):process(i,j,k)# 这里会被调用100万次# 有时候可以用itertools.product简化importitertoolsfori,j,kinitertools.product(range(100),repeat3):process(i,j,k)# 效果相同但更简洁常见坑点与调试技巧修改迭代中的集合这是最危险的错误users[Alice,Bob,Charlie]foruserinusers:ifuserBob:users.remove(user)# 千万别在遍历时修改原列表# 正确做法先记录要删除的元素循环后再删除无限循环总是设个安全计数器max_retries1000retry_count0whilenotconnection_established():retry_count1ifretry_countmax_retries:print(超过最大重试次数)break循环变量泄露for循环的变量在循环外也能访问foriinrange(5):passprint(i)# 输出4这可能不是你想要的个人经验建议实际项目中我更喜欢用for循环因为它更可控。while循环只在确实需要时才用比如监听网络端口或等待硬件信号。写循环时一定要问自己退出条件是否绝对可靠循环变量会不会被意外修改大数据集时有没有更高效的方法看到同事写while True我总会多看一眼。好的循环应该像呼吸一样自然——有明确的开始、节奏和结束。下次写循环前先在纸上画个流程图这习惯帮我避开了无数个深夜调试的坑。记住机器不嫌重复但你的时间很宝贵。

更多文章