看到这个名称应该很容易就可以猜到它的意思。没错!就是多层循环,也就是循环中还有循环。我们先看第一个例子:

for i in range(1, 6, 1):
for j in range(1, 3, 1):
print(i, j)

执行这一段程序码会看到下列结果:

1 1
1 2
2 1
2 2
3 1
3 2
4 1
4 2
5 1
5 2

读者可以先试着想想看,为什么会得到这样的结果?了解程序码的方法很简单,就是把自己当成电脑,一行一行执行程序。在执行的过程中,把变数的值写在纸上,然后观察它们如何随着程序执行的过程而改变。

巢状循环其实很像时钟,请参考图2。当秒针从0转到59的时候,分针才会加1,然后秒针又从0开始。也就是说,当秒针转一圈,分针才加1。用巢状循环来比喻,秒针就是内层循环,分针就是外层循环。当内层循环执行一轮之后,外层循环才会进到下一项。


图2 巢状循环的原理就像时钟的秒针和分针

了解巢状循环的原理之后,现在回头看前面的程序码范例。外层循环的索引变数是i,它会从1递增到5(因为我们设定range(1, 6, 1))。内层循环的索引变数是j,它会从1变到2(因为我们设定range(1, 3, 1))。当j从1变到2之后,i就会加1,然后j又从1开始,依照这种方式持续下去,直到外层循环结束。最后就看到前面列出的结果。

补充说明:关于巢状循环的索引变数

循环的索引变数习惯上会取名为i。如果是巢状循环,每一层循环的索引变数不可以有相同的名称,因此习惯上我们会把第二层循环的索引变数取名为j,第三层则取名为k,依此类推。

现在来看一个巢状循环的典型范例-九九乘法表。九九乘法表的顺序如下:

1 x 1 = 1
1 x 2 = 2
…
1 x 9 = 9
2 x 1 = 2
2 x 2 = 4
…
2 x 9 = 18
…
9 x 9 = 81

观察每一个式子被乘数的变化,当乘数从1递增到9之后,被乘数才会加1。被乘数加1之后,乘数又从1开始。这就是巢状循环的模式,所以九九乘法表可以利用以下巢状循环来产生:

for i in range(1, 10, 1):
for j in range(1, 10, 1):
print(i, 'x', j, '=', i*j)

只要短短三行程序码,就可以显示81行的九九乘法表,是不是很神奇?!印度还流行19乘19的乘法表,只要修改以上程序码中的二个数字,就可以产生19乘19的乘法表,完全不需要增加任何程序码,读者可以试看看。

最后再看一个例子。如果我们想用程序码显示如下结果,也就是数字n要显示n次,该怎么做?首先我们需要一个循环来控制数字显示的次数。另外还需要一个循环让数字递增,也就是从1变到9。比较特别的是,这个递增的数字,也决定了数字显示的次数,例如2显示二次,3显示三次。读者可以先试看看自己想出答案。

1
22
333
4444
55555
666666
7777777
88888888
999999999

以下就是解答。我们需要控制print()让它不要换行,这需要用到end参数。

for i in range(1, 10, 1):
for j in range(0, i, 1):
print(i, end='')   # 设定end参数让print()不要换行
print()   # 每印完一个数字要换行