6.6 嵌套循环
所谓嵌套循环,就是在循环语句的语句块里面还有循环语句,理论上说可以无限嵌套下去——但在实践中绝对不能这么做,甚至于嵌套很多层的代码都应该优化。
下面以常见的“打印九九乘方表”为例,演示嵌套 for 循环的基本写法。
代码语言:javascript复制#coding:utf-8
"""
filename: multitable.py
"""
for i in range(1, 10): # (15)
for j in range(1, i 1): # (16)
print(f"{j}x{i}={i*j}", end=" ") # (17) 注意 end 的值是空格,不是空字符串
print()
程序执行结果为:
代码语言:javascript复制% python multitable.py
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
在注释(15)的 for 循环之内,还有注释(16)所示的 for 循环,这就是针对 for 循环的嵌套。对照输出结果,不难理解嵌套循环发生了如下过程:
- 执行注释(15),
i = 1
; - 执行注释(16),即
for j in range(1, 2)
,只有j = 1
的情况,并执行注释(17),即print(f"1x1=1", end=" ")
。第一轮循环结束。 - 执行注释(15),
i = 2
; - 执行注释(16),即
for j in range(1, 3)
:- 当
j = 1
时,执行注释(17),即print(f"1x2=2")
; - 当
j = 2
时,执行注释(17),即print(f"2x2=4")
。执行完毕,第二轮循环结束。
- 当
- 按照上面的循环方式,持续进行下去,直到循环结束。
在数学领域,找质数是貌似简单但蕴含着深刻数学原理的工作,也是学习编程语言常用的示例。质数(Prime number,又称为素数)是指在大于 1 的自然数中,除了 1 和它本身外,不能被其他自然数整除的数。比如 2、3、5、7 等。根据定义,用嵌套 for 循环,写出下面的程序:
代码语言:javascript复制#coding:utf-8
'''
filename: nestfor.py
'''
num = []
i = 2
for i in range(2, 30):
for j in range(2, i):
if i % j == 0:
break
else:
num.append(i)
print(num)
执行结果:
代码语言:javascript复制% python nestfor.py
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
建议读者利用已经学过的知识,解读此程序。诚然,这并非是唯一方法,如果就这个问题在网上搜索,可以找到很多其他方法,建议读者参考并编写其他有关质数的程序。
除了嵌套 for 循环之外,嵌套 while 循环也是许可的,仍然以找素数为例,程序如下:
代码语言:javascript复制#coding:utf-8
'''
filename: nestwhile.py
'''
num = []
i = 2
while (i < 30):
j = 2
while j <= (i / j):
if not (i % j):
break
j = 1
if (j > i / j):
num.append(i)
i = 1
print(num)
执行结果:
代码语言:javascript复制% python nestwhile.py
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
甚至于还可以将 for 循环和 while 循环嵌套,比如打印九九乘法表的程序,还可以写成:
代码语言:javascript复制#coding:utf-8
"""
filename: multitable2.py
"""
for i in range(1, 10):
j = 1
while j <= i:
print(f"{j}x{i}={i*j}", end=' ')
j = 1
print()
执行结果:
代码语言:javascript复制% python multitable2.py
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
通过上述几个示例可知,嵌套循环的规则是:执行一次外部循环之后,等待内部循环执行终止,再执行下一次外部循环。显然,如果“嵌套”的层级越多,执行程序所耗费的时间就越长。所以,通常不要多层嵌套。根据一般的经验,超过了三层嵌套,代码就应该结合实际业务进行优化了——这仅仅是经验,非金科玉律。