打开课程目录
Module 4预计 80 分钟

for、range()、计数与累加

理解程序为什么重复,以及变量在每一轮怎样变化

学习目标

能够使用 for 和 range() 按规则重复代码,并通过追踪循环变量、Counter 和 Accumulator 理解每一轮的状态变化。

开始之前

到 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)。

Python
代码编辑器将在滚动到这里时加载
点击运行时准备 Python
TERMINAL程序输出

点击“运行”后,程序输出会显示在这里。

预期结果:1 / 2 / 3

概念 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 都在结束值之前停止。

Python
代码编辑器将在滚动到这里时加载
点击运行时准备 Python
TERMINAL程序输出

点击“运行”后,程序输出会显示在这里。

预期结果:range(5): / 0 / 1 / 2 / 3 / 4 / range(1, 6): / 1 / 2 / 3 / 4 / 5

概念 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
代码编辑器将在滚动到这里时加载
点击运行时准备 Python
TERMINAL程序输出

点击“运行”后,程序输出会显示在这里。

预期结果:输入 5:End number: Total: 15

常见错误

这些写法为什么不工作

错误不是失败,而是 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. 1先运行代码,确认最后只输出 Total: 10。
  2. 2在循环内部加入一个 f-string,显示本轮 number 和更新后的 total。
  3. 3把 limit 改成 3,用追踪结果手工检查 total 是否依次为 1、3、6。

完成后:limit 为 3 时,循环内依次显示 number 1/2/3 与 total 1/3/6,最后显示 Total: 6。

修改这段代码

先运行,再按左侧步骤逐项修改。你的草稿会保存在这个浏览器中。

Python
代码编辑器将在滚动到这里时加载
点击运行时准备 Python
TERMINAL程序输出

点击“运行”后,程序输出会显示在这里。

正式练习

现在独立完成 2 道练习

先运行代码观察问题,再点击“检查答案”。检查只关心题目要求的结果,不要求你照抄参考写法。

正式练习

按输入输出数字范围

练习 1/2

程序已经使用 input("End number: ") 接收正整数并保存到 limit。请只完成循环部分:必须使用 for 和 range() 输出从 1 到 limit;每行使用包含 number 变量插值的 f-string 输出 Number: {number}。range() 必须包含 limit。

10 分钟难度 2/3编写代码
代码编辑器将在滚动到这里时加载
TERMINAL程序输出

点击“运行”后,程序输出会显示在这里。

需要一点提示?

先自己尝试一次;卡住时再逐级打开提示。

本课总结

本课小结

  • 1Loop 按规则重复代码;for loop 会依次取得 range() 提供的数字。
  • 2Loop variable 在每一轮保存当前值,range() 不包含结束值。
  • 3Counter 记录次数,Accumulator 累积结果,两者都依赖 reassignment。
  • 4调试循环时先用小输入,逐轮打印 loop variable 和 accumulator,并检查边界。