循环套循环 · 机器人闯关
如果重复的那部分里面本身也有重复呢?
课程目录为什么需要它
很多任务有两层重复:三排座位,每排四个座位;正方形有四条边,每条边要走好几步。嵌套循环 Nested loop(循环里面再放一个循环)正好用来描述这种情况。
直觉理解
想想钟表:时针走一格,分针要转满一圈。内层循环要完全跑完,外层循环才进入下一轮。
for side in range(4): # 外层:4 条边
for step in range(3): # 内层:每条边 3 步
move()
turn_right() # 每条边一次move() 一共执行 4 × 3 = 12 次。turn_right() 只缩进了一层,属于外层循环,所以执行 4 次。缩进决定了一行属于哪个循环。
定义
嵌套循环 Nested loop
A nested loop is a loop placed inside the body of another loop; the inner loop runs completely for each round of the outer loop.嵌套循环是放在另一个循环体里的循环;外层每转一轮,内层都要完整跑一遍。
示例
三组,每组三颗
在互动课里运行外层循环数「组」,内层循环处理一组里的宝石。
for group in range(3):
for gem in range(3):
move()
pick()
move()逐步执行
- L1外层第 1 轮(group = 0)。
group = 0 - L3内层循环完整跑 3 轮:走、捡,重复三次。
gem = 0, 1, 2 - L5回到外层循环体:走过中间的空格。
group = 0 - L1外层第 2 轮,内层循环又从 gem = 0 开始。
group = 1 - •外层 3 轮后:捡了 9 颗宝石,小码站在旗子上。
绕着柱子走
在互动课里运行三条边,每条边两步,每走完一条边右转一次。
for side in range(3):
for step in range(2):
move()
turn_right()逐步执行
- L3第 1 条边:向东两步。
- L4这条边走完,右转一次。
- L3第 2 条边:向南两步。
- L3第 3 条边:向西两步,到达旗子。
常见错误
缩进层数不对
缩进 8 个空格的行属于内层循环,4 个空格属于外层。把一行挪一层,它执行的次数就变了。
两层用同一个计数器名字
两层循环的计数器用不同的名字(side、step)。两层都叫 i 会让人看糊涂,以后用到计数器时还会出错。
小测验
1. move() 一共执行几次?
for a in range(2):
for b in range(3):
move()查看答案
答案:B
外层 2 轮,每轮内层 3 次:2 × 3 = 6。
2. 小码最后停在哪里?
for side in range(3):
for step in range(2):
move()
turn_right()查看答案
答案:B
turn_right() 在内层循环里,所以小码每走一步就转一次,结果撞上中间的柱子。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出两条边
预测小码最后停在哪里。
- 改需求每组更多
新地图是 2 组,每组 4 颗宝石。改一下数字,让小码捡完所有宝石并走到旗子。
- 从零写宝石环
绕着中间的墙走,捡起 9 颗宝石,最后走到旗子上。用嵌套循环,最多 6 行。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Nested loop | 嵌套循环 | A loop inside the body of another loop. |
| Inner loop | 内层循环 | The loop inside; it runs completely for each round of the outer loop. |
| Outer loop | 外层循环 | The loop that contains another loop. |