Python 中的循环语句有 for 和 while,这一节主要介绍while循环,for循环将在后面提到。在开始详细介绍之前,让我们先了解一下:while循环是Python中最实用的循环结构之一,它能让你的程序根据特定条件重复执行特定任务,非常适合处理那些"不确定要重复多少次"的场景。
什么是While循环?
想象一下你在洗碗,你的原则是"只要还有脏盘子,我就继续洗"。这就是while循环的本质!它就像是一个带条件的重复动作:只要某个条件成立,就一直做某件事。
基础语法结构
Python的while循环很好理解,它的语法结构是:
while 条件为真: # 当这个条件成立时
要做的事情 # 就一直执行这里的代码
更新条件 # 别忘了改变条件,否则可能永远循环下去
For循环和While循环的区别
让我用点外卖的例子来解释这两种循环的区别:
For循环 就像:
# 我确定要点5份外卖,所以直接循环5次
for i in range(5): # 我知道要点5次外卖
print(f"点了第{i+1}份外卖") # 每次都点一份
While循环 就像:
饥饿程度 = 8 # 开始时很饿,假设10分是最饿
while 饥饿程度 > 3: # 只要还觉得饿(饥饿度>3)
print("再点一份外卖") # 就再点一份
饥饿程度 -= 2 # 吃完一份,饥饿程度下降2点
核心区别:
- for循环:事先知道要循环几次(我要点5份外卖)
- while循环:不确定循环几次,由条件决定(我要点到不饿为止)
新手容易踩的坑
- 忘记更新循环变量:这是最常见的错误!
count = 1
while count < 5:
print(count) # 这会一直打印1,因为count值从未改变
# 应该加上:count += 1 或者count = count+1
2. 条件永远为真:导致程序无限循环
while True: # 这个条件永远为真
print("永远停不下来...") # 除非用Ctrl+C强制中断程序
3. 条件判断写反了:导致循环一次都不执行
count = 10
while count < 5: # 因为10不小于5,所以循环体一次都不会执行
print(count)
4. 忘记处理边界情况:特别是处理用户输入时
Python循环控制三剑客:break、continue与while else
上一节我们已经介绍了while循环,但是并没有说明如何结束循环,这一节里我们将了解结束循环的几个方法。在我们深入学习循环控制语句之前,让我们回忆一个生活场景:假设你正在用手机播放音乐,当遇到不喜欢听的歌时,你可能会选择「跳过当前歌曲」(continue),或者直接「退出播放列表」(break)。这种日常行为模式与Python的循环控制机制是类似的。
在Python中,break与continue可以比作「交通信号灯」,它们能够精确控制代码的执行路径。而else语句则像是一个「交警」,在特定条件下发出执行信号。这三个语句的配合使用,能让我们写出更灵活、更安全的循环结构。
这里我只介绍了三种,且主要针对的是while循环
break语句:红灯停!
break语句的作用相当于十字路口的红灯突然亮了,需要停车,所以此时我们应该break the red light(开个玩笑,大家行车还是要遵守交通规则的)。当程序执行到break时,会立即终止整个循环结构,转而执行循环之后的代码。这种情况通常发生在需要提前终止循环的条件时。
# 微波炉加热模拟
加热时间 = 0
while 加热时间 < 300: # 最大加热时间5分钟
加热时间 += 10
if 食物温度检测() >= 75: # 温度达到安全食用标准
print("叮!食物已加热完成")
break
print(f"已加热{加热时间}秒")
在这个示例中:
加热时间
变量以10秒为增量递增- 每次循环都会检测食物温度
- 温度达标时立即终止加热过程
典型应用场景
- 用户输入验证(发现非法输入立即终止)
- 数据搜索(找到目标后立即停止遍历)
- 异常检测(检测到危险值立即中止处理)
continue语句:过滤
continue语句的作用类似于超市收银台的商品扫描器。当遇到无法识别的商品时,收银员会暂时跳过这件商品,继续处理后续物品。
# 快递分拣系统示例
待处理包裹数 = 50
while 待处理包裹数 > 0:
包裹 = 取下一个包裹()
待处理包裹数 -= 1
if 包裹.破损: # 发现破损包裹
记录异常(包裹)
continue # 跳过当前异常包裹
分拣到对应区域(包裹)
print(f"已处理{包裹编号}")
这个示例展示了:
- continue不会终止整个while循环
- 跳过当前迭代的后续代码并继续下一个迭代
- 循环变量仍然正常更新
- 异常处理与正常流程分离
在数据处理场景中,合理使用continue可以提升处理效率。例如在遍历百万级数据时,通过提前跳过无效记录,减少不必要的计算。
for 记录 in 千万级数据:
if 记录.无效: continue
复杂计算(记录)
数据入库(记录)
当然 continue 的使用绝不是局限于处理异常,它的本质只是满足条件时提前结束当前当次循环。
以下这张图能直观的看出在while循环中break与continue的区别:
while-else结构:双重保障机制
while-else经常让初学者困惑,其实可以理解为「循环的附加验收环节」。只有当循环正常结束(非break中断)时,else块才会执行。实际编写时,我们恐怕很少会用到他。
# 智能快递柜查询系统
查询次数 = 3
while 查询次数 > 0:
验证码 = input("请输入取件码:")
if 验证码有效(验证码):
打开柜门()
break
查询次数 -= 1
else:
冻结账户()
print("错误次数过多,请联系客服")
在此案例中:
- 用户有3次尝试机会
- 正确输入立即跳出循环
- 3次错误后执行else块
- 冻结账户操作只会在循环正常结束时触发
常见误区
- break陷阱:在多层嵌套循环中,break只能跳出最近的一层循环
- continue副作用:可能造成循环变量更新遗漏,导致死循环
- else误用:错误地将收尾代码放在else块,而实际需要始终执行
# 危险示例:可能造成死循环
count = 0
while count < 5:
if count == 3:
continue # 跳过count +=1
print(count)
count +=1
调优技巧
- 在数据遍历时,优先考虑使用break提前退出
- 对大数据集处理,合理使用continue过滤无效数据
- 避免在循环体内进行不必要的计算
- 使用else替代标志变量来追踪循环状态
# 优化前
找到 = False
for 商品 in 商品列表:
if 商品.库存 > 0:
加入购物车(商品)
找到 = True
break
if not 找到:
显示缺货提示()
# 优化后
for 商品 in 商品列表:
if 商品.库存 > 0:
加入购物车(商品)
break
else:
显示缺货提示()