开始之前
到 M3 为止,程序已经能够根据输入选择路径,但每段代码仍然只执行一次。M4 开始解决另一类问题:怎样按照规则重复执行同一段代码。
循环的重点不只是少写几行代码,而是看懂重复规则、每轮变量的值以及停止位置。我们会用小输入和执行追踪表观察这些变化。
概念 01
Loop 按规则重复,Loop variable 记录当前一轮
需要处理不同数量的数据或重复步骤时,循环能够根据规则决定重复次数,而不需要手工复制代码。
Loop 的英文全称是 Loop,中文叫循环。循环让一段代码重复执行多次。与手写 print(1)、print(2)、print(3)、print(4)、print(5) 相比,for number in range(1, 6): 会让程序按照数字规则重复;核心不是单纯少写代码,而是让重复次数由规则控制。
for loop 的英文全称是 for loop,中文叫 for 循环。Python 写成 for number in range(1, 6):,表示依次取得 range() 提供的数字,并执行下方缩进代码。for 开始循环;number 保存本轮数字;in 可读成“来自”;冒号和 indentation 标记循环 body(循环体)。
range function 的英文全称是 range function,中文可称为范围函数,Python 写成 range()。它会提供一系列整数,常用于控制 for loop 的重复次数;例如 range(1, 4) 提供 1、2、3,让循环执行三轮。下一段会继续解释它的结束边界。
Loop variable 的英文全称是 Loop variable,中文叫循环变量。在 for number in range(1, 4): 中,number 不是预先固定的值,而是在每一轮由 for 更新:第 1 轮 number → 1,第 2 轮 number → 2,第 3 轮 number → 3。它让循环体知道当前正在处理哪一轮。
执行追踪表中的 Iteration(循环轮次)表示这是第几次重复:Iteration | number | output;第 1 轮 | 1 | 1;第 2 轮 | 2 | 2;第 3 轮 | 3 | 3。读循环时不要直接跳到最终输出,先逐轮写出 loop variable 的值。
- Loop:按规则重复代码
- for loop:依次处理 range() 提供的值
- Loop variable:保存当前一轮的值
- 缩进代码会在每一轮执行
- 先逐轮追踪,再判断最终输出
追踪 number 在三轮中的变化
range(1, 4) 依次提供 1、2、3。每轮先更新 number,再运行缩进的 print(number)。
点击“运行”后,程序输出会显示在这里。
概念 02
range function 决定数字范围,但不包含结束值
看懂 range() 的开始和结束规则,才能准确控制重复次数并避免多一轮或少一轮。
现在继续观察 range() 的边界规则。range(5) 提供 0、1、2、3、4;开始值默认是 0,结束值 5 不包含在内。
range(1, 6) 提供 1、2、3、4、5。括号中的第一个 argument 是开始值,第二个是结束边界;Python 到达结束边界前就停止。本课先掌握这两种形式,不使用更复杂的 step 参数。
Off-by-one error 的英文全称是 Off-by-one error,中文常叫差一错误,表示循环比目标多一次或少一次。想输出 1 到 5 却写 range(1, 5),实际只会得到 1 到 4;实际用途是提醒我们测试范围的第一个值和最后一个值。
如果结束值来自变量 limit,而且目标包含 limit,通常需要写 range(1, limit + 1)。这里 + 1 不是多执行一轮,而是补偿 range 不包含结束值的规则。
- range(5) 提供 0 到 4
- range(1, 6) 提供 1 到 5
- 结束值不包含
- Off-by-one error:多一轮或少一轮
- 测试开始值与结束边界
比较 range(5) 与 range(1, 6)
第一段从默认开始值 0 到 4;第二段从 1 到 5。两个 range 都在结束值之前停止。
点击“运行”后,程序输出会显示在这里。
概念 03
Counter 记录次数,Accumulator 逐步累积结果
循环经常不只显示当前值,还需要记录发生次数或把每轮结果合并成一个最终答案。
Counter 的英文全称是 Counter,中文叫计数器。Counter 是记录某件事发生多少次的变量。Python 没有专门的 counter 关键字;常见写法是先 count = 0,再在循环中 count = count + 1。它实际可用于统计尝试次数、达标次数或处理了多少条记录。
Counter 依赖 M1 的 reassignment:开始 count → 0;第 1 轮执行 count = count + 1 后 count → 1;第 2 轮 count → 2;继续到第 5 轮 count → 5。等号右边先使用旧值计算,结果再保存回同一个变量。
Accumulator 的英文全称是 Accumulator,中文叫累加器。Accumulator 是逐步累积计算结果的变量。常见写法是 total = 0,再在每轮执行 total = total + number;实际可用于合计实验读数、距离或一组数字的总和。
Accumulator 执行追踪表:number | total before | total after;1 | 0 | 1;2 | 1 | 3;3 | 3 | 6;4 | 6 | 10;5 | 10 | 15。每轮的 total after 会成为下一轮的 total before,这就是 reassignment 如何连接多轮计算。
综合程序先用 input() 和 int() 得到 limit,再让 range(1, limit + 1) 包含 limit。Accumulator total 从 0 开始,逐轮加入 number,最后用 f-string 输出被保存的结果。
- Counter:记录发生次数
- Accumulator:累积计算结果
- 两者都依赖 reassignment
- 初始值会影响最终结果
- 打印 loop variable 与 accumulator 可以追踪每轮状态
输入结束数字并累加 1 到该数字
limit + 1 让 range 能够包含 limit。每轮把当前 number 加入 total,循环结束后 total 保存完整累加结果。
点击“运行”后,程序输出会显示在这里。
常见错误
这些写法为什么不工作
错误不是失败,而是 Python 告诉你“这部分我无法理解”。先找到差异,再一次只改一个问题。
忘记 range 不包含结束值
目标包含 limit 时,range(1, limit) 会提前停止。用 1、2、3 这样的小输入打印 loop variable,可以很快发现最后一个值没有进入循环。
limit = 5
for number in range(1, limit):
print(number)limit = 5
for number in range(1, limit + 1):
print(number)计算了新结果,却没有保存回 Accumulator
只写 total + number 会产生一个结果,但没有 assignment 接住它,total 仍然是旧值。逐轮打印 number 和 total 可以发现 total 从未变化。
total = 0
for number in range(1, 4):
total + number
print(total)total = 0
for number in range(1, 4):
total = total + number
print(total)引导修改
把最终总和改成逐轮追踪
这不是正式练习。跟着步骤修改已有代码,观察每次改变如何影响程序。
- 1先运行代码,确认最后只输出 Total: 10。
- 2在循环内部加入一个 f-string,显示本轮 number 和更新后的 total。
- 3把 limit 改成 3,用追踪结果手工检查 total 是否依次为 1、3、6。
完成后:limit 为 3 时,循环内依次显示 number 1/2/3 与 total 1/3/6,最后显示 Total: 6。
修改这段代码
先运行,再按左侧步骤逐项修改。你的草稿会保存在这个浏览器中。
点击“运行”后,程序输出会显示在这里。
正式练习
现在独立完成 2 道练习
先运行代码观察问题,再点击“检查答案”。检查只关心题目要求的结果,不要求你照抄参考写法。
正式练习
按输入输出数字范围
程序已经使用 input("End number: ") 接收正整数并保存到 limit。请只完成循环部分:必须使用 for 和 range() 输出从 1 到 limit;每行使用包含 number 变量插值的 f-string 输出 Number: {number}。range() 必须包含 limit。
点击“运行”后,程序输出会显示在这里。
需要一点提示?
先自己尝试一次;卡住时再逐级打开提示。
本课总结
本课小结
- 1Loop 按规则重复代码;for loop 会依次取得 range() 提供的数字。
- 2Loop variable 在每一轮保存当前值,range() 不包含结束值。
- 3Counter 记录次数,Accumulator 累积结果,两者都依赖 reassignment。
- 4调试循环时先用小输入,逐轮打印 loop variable 和 accumulator,并检查边界。