(六)循环与逐步更新
1. while:反复执行直到判断改变
把三天各 20 分钟累加起来:
# day 记录已经处理到哪一天,total 记录处理过的累计时长。
day = 1
total = 0
while day <= 3:
total += 20
print(day, total)
day += 1
print("合计", total)while 下面缩进的三条语句组成循环体,每轮依次执行。最后的 print("合计", total) 退回行首,等循环结束后执行一次;如果把它也缩进到循环体中,就会在每轮输出一次合计。这里仍然用缩进决定语句的归属。
total += 20 在这个整数例子中完成“读取旧值、加 20、重新赋值”。day += 1 推进状态,下一轮重新计算条件。
| 时刻 | day |
条件 day <= 3 |
更新后的 total |
|---|---|---|---|
| 第一轮 | 1 | 真 | 20 |
| 第二轮 | 2 | 真 | 40 |
| 第三轮 | 3 | 真 | 60 |
| 再次判断 | 4 | 假 | 60,不再进入循环 |
图中把判断、累计、推进和返回判断分开。若删去 day += 1,day 会一直是 1,程序也会一直重复第一轮的判断。
2. for 与 range:按序取出一个个值
# range(1, 4) 依次提供 1、2、3,停止位置 4 不包含在内。
total = 0
for day in range(1, 4):
total += 20
print(day, total)
print("合计", total)每一轮先从 range 取一个值,绑定给 day,再执行循环体。range 描述一个整数序列,不需要事先建立包含所有整数的列表。
| 写法 | 依次得到的值 |
|---|---|
range(4) |
0, 1, 2, 3 |
range(2, 5) |
2, 3, 4 |
range(1, 7, 2) |
1, 3, 5 |
range(5, 0, -2) |
5, 3, 1 |
第三个参数是步长。正步长向较大的数走,负步长向较小的数走,停止位置仍然不取。range(3, 3) 没有值可以取,循环体就执行零次。
3. continue、break 与循环 else
# 跳过 2,到 5 时结束整个循环。
for day in range(1, 7):
if day == 2:
continue
if day == 5:
break
print(day)输出 1、3、4。continue 跳过本轮剩下的语句,break 结束当前这一层循环。嵌套循环中的 break 退出最靠近它的一层。
查找第一个满足条件的值时,还可以把“没有提前找到”的动作放进循环 else:
# 找到 4 就提前结束;循环被 break 结束时不执行 else。
for number in range(1, 6):
if number == 4:
print("找到", number)
break
else:
print("没有找到")把目标改成 9,循环取完全部值后,会执行 else。这个 else 对齐的是 for,表示这轮循环没有被 break 提前结束;即使序列一开始就是空的,也会走到这里。它不是“最后一次 if 判断为假”的动作。