教会新手写Python(7)—— 循环语句

23 阅读6分钟

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循环:不确定循环几次,由条件决定(我要点到不饿为止)

新手容易踩的坑

  1. 忘记更新循环变量:这是最常见的错误!
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中,breakcontinue可以比作「交通信号灯」,它们能够精确控制代码的执行路径。而else语句则像是一个「交警」,在特定条件下发出执行信号。这三个语句的配合使用,能让我们写出更灵活、更安全的循环结构。

这里我只介绍了三种,且主要针对的是while循环

break语句:红灯停!

break语句的作用相当于十字路口的红灯突然亮了,需要停车,所以此时我们应该break the red light(开个玩笑,大家行车还是要遵守交通规则的)。当程序执行到break时,会立即终止整个循环结构,转而执行循环之后的代码。这种情况通常发生在需要提前终止循环的条件时。

# 微波炉加热模拟
加热时间 = 0
while 加热时间 < 300:  # 最大加热时间5分钟
    加热时间 += 10
    if 食物温度检测() >= 75:  # 温度达到安全食用标准
        print("叮!食物已加热完成")
        break
    print(f"已加热{加热时间}秒")

在这个示例中:

  1. 加热时间变量以10秒为增量递增
  2. 每次循环都会检测食物温度
  3. 温度达标时立即终止加热过程

典型应用场景

  • 用户输入验证(发现非法输入立即终止)
  • 数据搜索(找到目标后立即停止遍历)
  • 异常检测(检测到危险值立即中止处理)

continue语句:过滤

continue语句的作用类似于超市收银台的商品扫描器。当遇到无法识别的商品时,收银员会暂时跳过这件商品,继续处理后续物品。

# 快递分拣系统示例
待处理包裹数 = 50
while 待处理包裹数 > 0:
    包裹 = 取下一个包裹()
    待处理包裹数 -= 1
    
    if 包裹.破损:        # 发现破损包裹
        记录异常(包裹)
        continue       # 跳过当前异常包裹
        
    分拣到对应区域(包裹)
    print(f"已处理{包裹编号}")

这个示例展示了:

  1. continue不会终止整个while循环
  2. 跳过当前迭代的后续代码并继续下一个迭代
  3. 循环变量仍然正常更新
  4. 异常处理与正常流程分离

在数据处理场景中,合理使用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块
  • 冻结账户操作只会在循环正常结束时触发

常见误区

  1. break陷阱:在多层嵌套循环中,break只能跳出最近的一层循环
  2. continue副作用:可能造成循环变量更新遗漏,导致死循环
  3. else误用:错误地将收尾代码放在else块,而实际需要始终执行
# 危险示例:可能造成死循环
count = 0
while count < 5:
    if count == 3:
        continue  # 跳过count +=1
    print(count)
    count +=1

调优技巧

  1. 在数据遍历时,优先考虑使用break提前退出
  2. 对大数据集处理,合理使用continue过滤无效数据
  3. 避免在循环体内进行不必要的计算
  4. 使用else替代标志变量来追踪循环状态
# 优化前
找到 = False
for 商品 in 商品列表:
    if 商品.库存 > 0:
        加入购物车(商品)
        找到 = True
        break
if not 找到:
    显示缺货提示()

# 优化后
for 商品 in 商品列表:
    if 商品.库存 > 0:
        加入购物车(商品)
        break
else:
    显示缺货提示()