人人都能学编程
English 开始学习
课程 1 · 零基础入门第 6 课 / 共 10 课免费阅读

循环套循环 · 机器人闯关

如果重复的那部分里面本身也有重复呢?

课程目录

为什么需要它

很多任务有两层重复:三排座位,每排四个座位;正方形有四条边,每条边要走好几步。嵌套循环 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()
逐步执行
  1. L1外层第 1 轮(group = 0)。group = 0
  2. L3内层循环完整跑 3 轮:走、捡,重复三次。gem = 0, 1, 2
  3. L5回到外层循环体:走过中间的空格。group = 0
  4. L1外层第 2 轮,内层循环又从 gem = 0 开始。group = 1
  5. •外层 3 轮后:捡了 9 颗宝石,小码站在旗子上。

绕着柱子走

在互动课里运行

三条边,每条边两步,每走完一条边右转一次。

for side in range(3):
    for step in range(2):
        move()
    turn_right()
逐步执行
  1. L3第 1 条边:向东两步。
  2. L4这条边走完,右转一次。
  3. L3第 2 条边:向南两步。
  4. L3第 3 条边:向西两步,到达旗子。

常见错误

缩进层数不对

缩进 8 个空格的行属于内层循环,4 个空格属于外层。把一行挪一层,它执行的次数就变了。

两层用同一个计数器名字

两层循环的计数器用不同的名字(side、step)。两层都叫 i 会让人看糊涂,以后用到计数器时还会出错。

小测验

1. move() 一共执行几次?

for a in range(2):
    for b in range(3):
        move()
  1. A5
  2. B6
  3. C3
查看答案

答案:B

外层 2 轮,每轮内层 3 次:2 × 3 = 6。

2. 小码最后停在哪里?

for side in range(3):
    for step in range(2):
        move()
        turn_right()
  1. A旗子上
  2. B第 3 行撞墙
  3. C右上角
查看答案

答案:B

turn_right() 在内层循环里,所以小码每走一步就转一次,结果撞上中间的柱子。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出两条边

    预测小码最后停在哪里。

  2. 改需求每组更多

    新地图是 2 组,每组 4 颗宝石。改一下数字,让小码捡完所有宝石并走到旗子。

  3. 从零写宝石环

    绕着中间的墙走,捡起 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.