循环结构A
中,嵌入了另外的循环结构B
作为循环结构A
的循环体,这样的循环结构被称为嵌套循环
用for
...in
...嵌套循环做个简单的演示(三行四列打印输入*
)
for _ in range(3):
for _ in range(4):
print('*', end='\t')
print()
运行结果:(运行结果用-
代表空格,以便观察)
- *---*---*---*---
- *---*---*---*---
- *---*---*---*---
分解:
第一行:无需访问自定义变量,用_
下划线代替,选题要求是三行,用range()
函数控制循环次数3
次
第二行:嵌入新的for
...in
...循环作为第一行for
...in
...循环的循环体,无需访问自定义变量,用_
下划线代替,选题要求是四列,用range()
函数控制循环次数4
次
第三行:循环打印输出*
,4
次,默认情况下,print()
函数输出后末尾会默认添加换行符,这样一行输出一个*
的话,就不符合我们的选题了,所以在print()
函数括号内末尾加上end=''
,可以把print()
函数默认添加的换行符替换成一个空字符串,这样就可以实现不换行输出了,也就是两个*
之间会相隔一个空字符串,因为是空字符串,所以没有间隔,但是这样****
紧紧挨着不美观,所以在空字符串内加入一个转义符\t
,前面学过,转义符\t
是一组四个空格的制表符,也就是代表四个空格,这样两个*
之间就会有空格了,但为什么上面相隔的是三个空格,而不是四个空格呢,这是因为*
占据了一个空格的位置(详细解读可以看之前的转义符笔记),这个空字符串里面可以加所有转义符\n
\t
\r
\b
,甚至可以直接添加空格,想加几个加几个,也可以添加字符,具体效果可以参考转义符笔记和实际测试看看(部分转义符需要一次多输出几个字符才能看出效果,例如:\r
\b
,一个*
是测不出具体效果的)
第四行:这个空的print()
函数属于第一行for
...in
...循环的循环体,所以要第二行for
...in
...循环结束后,才会运行,也就是一行四列的*
输出完毕后再运行,这时候我们需要换行,那么为什么写一个空的print()
函数呢,刚说过,print()
函数会默认在末尾添加一个换行符,这个空的print()
函数就代表只输出了一个换行符,这样就完成了换行,然后回到第一行for
...in
...循环继续第二次第三次循环,输出二行四列三行四列的*
第二个演示(打印九九乘法表)
我们找找九九乘法表的规律,先用*
代替公式打印出来
第一行一个公式,第二行二个公式,第三行三个公式,依次到第九行九个公式,那么我们知道了,第N
行要有N
个公式,每输出一行就要增加一个公式,我们需要做到的是,嵌套循环的内层循环每次运行结束后,下次重新开始之前要增加一次循环次数,下面看演示
for a in range(1, 10):
for b in range(1, a + 1):
print('*', end='\t')
print()
运行结果:(运行结果用-
代表空格,以便观察)
- *---
- *---*---
- *---*---*---
- *---*---*---*---
- *---*---*---*---*---
- *---*---*---*---*---*---
- *---*---*---*---*---*---*---
- *---*---*---*---*---*---*---*---
- *---*---*---*---*---*---*---*---*---
分解:(第一个选题是详解,会讲的细一些,下面的分解我们直接把第一行的for
...in
...循环称为外层循环,第二行的for
...in
...循环称为内层循环)
第一行:自定义变量a
取值范围range(1, 10)
代表整数1 - 9
第二行:自定义变量b
取值范围range(1, a + 1)
,假设外层循环是第一次循环,变量a
的值为1
,那么变量b
的取值范围为range(1, 1 + 1)
等于range(1, 2)
代表整数1
,此时内层循环的循环次数为一次,对应了第一行一个公式这个条件,然后外层循环进入第二次循环,变量a
的值为2
,那么变量b
的取值范围为range(1, 2 + 1)
等于range(1, 3)
代表整数1 - 2
,此时内层循环的循环次数为二次,对应了第二行二个公式这个条件,直到外层循环进入第九次循环,变量a
的值为9
,那么变量b
的取值范围为range(1, 9 + 1)
等于range(1, 10)
代表整数1 - 9
,此时内层循环的循环次数为九次,对应了第九行九个公式这个条件,再然后变量a
无值可取,整个嵌套循环结构结束运行,这样基本符合了九九乘法表的阶梯式模型
第三行:打印输出*
,内层循环当前循环次数为N
次,就输出N
个*
,print()
函数括号内末尾加上end=''
实现不换行输出
第四行:当前内层循环结束后,同为外层循环的循环体,空函数print()
用来输出换行符
上面的代码只是实现了九九乘法表的阶梯式模型,现在要用正确的公式代替*
for a in range(1, 10):
for b in range(1, a + 1):
print(b, '*', a, '=', b * a, end='\t')
print()
运行结果:(运行结果用-
代表空格,以便观察)
- 1 * 1 = 1---
- 1 * 2 = 2---2 * 2 = 4---
- 1 * 3 = 3---2 * 3 = 6---3 * 3 = 9---
- 1 * 4 = 4---2 * 4 = 8---3 * 4 = 12---4 * 4 = 16---
- 1 * 5 = 5---2 * 5 = 10---3 * 5 = 15---4 * 5 = 20---5 * 5 = 25---
- 1 * 6 = 6---2 * 6 = 12---3 * 6 = 18---4 * 6 = 24---5 * 6 = 30---6 * 6 = 36---
- 1 * 7 = 7---2 * 7 = 14---3 * 7 = 21---4 * 7 = 28---5 * 7 = 35---6 * 7 = 42---7 * 7 = 49---
- 1 * 8 = 8---2 * 8 = 16---3 * 8 = 24---4 * 8 = 32---5 * 8 = 40---6 * 8 = 48---7 * 8 = 56---8 * 8 = 64---
- 1 * 9 = 9---2 * 9 = 18---3 * 9 = 27---4 * 9 = 36---5 * 9 = 45---6 * 9 = 54---7 * 9 = 63---8 * 9 = 72---9 * 9 = 81---
为了得到完整的公式,我们需要把当前变量a
和变量b
的值原原本本的输出作为两个运算数,*
和=
作为运算符以字符串的形式输出,最后输出当前变量a
和变量b
的值相乘得到的值作为运算结果,来形成一个完整的公式(例如:外层循环第三次循环,变量a
的值为3
,内层循环第二次循环,变量b
的值为2
,套入函数print
(b
, '*'
, a
, '='
, b * a
)等于print
(2
, '*'
, 3
, '='
, 2 * 3
),除了后面的表达式2 * 3
会被运算后输出,前面的都会被原原本本的输出,这样就得到了一个完整的公式2 * 3 = 6
),为什么变量b
要放前面呢,作为内层循环的自定义变量,外层循环每次重新运行后,变量b
都要重新从1
开始按顺序取值,这样九九乘法表的整体都是按从小(左上)到大(右下)的顺序来的,更加美观