Python 现代开发学习笔记

(六)循环与逐步更新

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 判断为假”的动作。

笔记正文与全部题解 · Ctrl / ⌘ K