开源图书《Python完全自学教程》6.6嵌套循环

2022-07-06 15:54:57 浏览数 (1)

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 循环的嵌套。对照输出结果,不难理解嵌套循环发生了如下过程:

  1. 执行注释(15),i = 1
  2. 执行注释(16),即 for j in range(1, 2) ,只有 j = 1 的情况,并执行注释(17),即 print(f"1x1=1", end=" ")。第一轮循环结束。
  3. 执行注释(15),i = 2
  4. 执行注释(16),即 for j in range(1, 3)
    1. j = 1 时,执行注释(17),即 print(f"1x2=2") ;
    2. j = 2 时,执行注释(17),即 print(f"2x2=4") 。执行完毕,第二轮循环结束。
  5. 按照上面的循环方式,持续进行下去,直到循环结束。

在数学领域,找质数是貌似简单但蕴含着深刻数学原理的工作,也是学习编程语言常用的示例。质数(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 

通过上述几个示例可知,嵌套循环的规则是:执行一次外部循环之后,等待内部循环执行终止,再执行下一次外部循环。显然,如果“嵌套”的层级越多,执行程序所耗费的时间就越长。所以,通常不要多层嵌套。根据一般的经验,超过了三层嵌套,代码就应该结合实际业务进行优化了——这仅仅是经验,非金科玉律。

0 人点赞