学径 LearnPath

CAICP-E · Python 编程基础

一行又一行

循环套循环,用来排格子、写乘法表。

讲解模式

这一节要学会什么

#what

你会把 循环 再套一层。这就叫 嵌套

外圈走一步。内圈把这一行做完。

你会打印星星格子。会写出一小段乘法表。 这是这节课的主活。

上衣和裤子也可以一对一对配。内层里可以再写 ifbreak 只停它所在的那一层。先轻轻看一眼。

课表是一张格子纸

#hook

课表有行,也有列。先换一天,再把当天的课走完。

填格子也一样。一层管行。 一层管列。

外圈像换行。内圈像在这一行里一格一格填。

格子纸

如果觉得有点难 用手指点:外圈一次,内圈扫一行。 先慢,再写代码。

如果已经会了 打印 3 行 4 列的星星。 再写出 1 到 3 的一小段乘法表。

外圈一行,内圈一颗星

#explore-grid

打印 3 行 4 列的星星:

python
for row in range(3):
    line = ""
    for col in range(4):
        line = line + "*"
    print(line)

屏幕上会得到:

python
****
****
****

外层 row 管行。它走 3 步,就有 3 行。

内层 col 管这一行有几颗星。它走 4 步,一行就有 4 颗。

每一行先准备空字符串。内圈把星星接上去。 内圈结束,再 print 这一行。

内层循环必须缩进到外层里面。两层缩进要对齐。 外层的 print 只缩进一层。它等内圈全部做完,才打印这一行。

三行四列小星星

试着改成 2 行 5 列。只改两个数字。 格子就会变。

乘法表:每个乘每个

#explore-times

格子不一定是星星。数字也可以一格一格填。

python
for i in range(1, 4):
    for j in range(1, 4):
        print(i, "x", j, "=", i * j)

外圈 i 取 1、2、3。每个 i,内圈 j 再取 1、2、3。

一共 3 × 3 = 9 行。每一行都是一道乘法。

这就是一小段乘法表。先估次数,再写两个 for

range(3)、内 range(2),内层每次 print 一次。一共几行? 3 × 2 = 6 行。

外圈三步内圈两步共六个脚印

嵌套循环次数会变多。3 行 4 列,内圈要跑 12 次。 写之前先乘一乘。

上衣乘裤子:每种都配一遍

#explore-outfit

两件上衣,三条裤子。有多少种搭配?

不必先把衣服装进列表。外圈走上衣 1、2。 内圈走裤子 1、2、3。

python
for top in range(1, 3):
    for pants in range(1, 4):
        print("上衣", top, "配裤子", pants)

会打印 6 行。一共 2 × 3 = 6 套。

这叫枚举所有组合。每个和每个都试一次。

两件上衣三条裤子配出六套

衣服、课表、格子,都是同一套路。先问:谁在外圈?谁在内圈?

内圈里也可以问一句

#explore-if

内层循环里,可以再写 if。星星格子已经是两层。 if 再往里站一点就行。

比如第一列用 #,后面用 *

python
for row in range(3):
    line = ""
    for col in range(4):
        if col == 0:
            line = line + "#"
        else:
            line = line + "*"
    print(line)

会得到:

python
#***
#***
#***

if 属于内层。它每一格都问一次。 外层还是只管换行。

先看一眼就够。主活还是两层 range 把格子铺满。

内层 break 停哪一层

#explore-break

你已经会 break。套在两层里,它只离开当前这一层。

python
for i in range(1, 4):
    for j in range(1, 4):
        if j == 2:
            break
        print(i, j)

内层遇到 j == 2 就停。但外层还会继续下一个 i

所以会看到:

python
1 1
2 1
3 1

每一行才印到第一格。第二格一到,内圈就收工。 下一行又从头扫。

内层扫到第二格就停,下一行还继续

想两层都停,需要别的办法。本课只要知道:break 打的是它所在的那一层。

别套太深。两层刚刚好。 先画格子,再写两个 for

这节课我学会了

#review

记住这些:

  1. 外循环走一步,内循环走完整一轮。
  2. 内层要再缩进一层。
  3. 行和列、乘法表、上衣配裤子,都常用嵌套。
  4. 内层可以再写 if
  5. break 默认只停当前层。

试着在心里跑一遍:

python
for row in range(2):
    line = ""
    for col in range(3):
        line = line + "*"
    print(line)

会印两行,每行三颗星。

下一课才把一组东西装进一排格子。先把「一行又一行」跑熟。

试一试

#evaluate

看完就来检查一下。选错了也可以再想。

单选题

打印多少行

外层 range(3),内层 range(2),内层每次 print 一次。一共打印几行?

单选题

break 停哪一层

内层 for 里写了 break。它通常会怎样?

单选题

星星印几行

外层 range(3),内层把 4 颗星拼成一行,外层再 print 这一行。屏幕上会出现几行星星?

多选题

关于嵌套循环

下列说法正确的有哪些?可以多选。

可多选

未登录时不会保存学习进度