前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开源图书《Python完全自学教程》6.6嵌套循环

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

作者头像
老齐
发布2022-07-06 15:54:57
4140
发布2022-07-06 15:54:57
举报
文章被收录于专栏:老齐教室

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 

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 6.6 嵌套循环
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档