1
头图

首先,从输出最基本的图形开始:输出一个'✮'。
print('✮')
那如何用循环实现输出五颗'✮'呢?

#代码块1
i = 1
while i <= 5:
    print ('✮')
    i += 1

#实际输出结果如下:
✮
✮
✮
✮
✮

我们如果想不换行输出,该怎么调整呢?这时候我们可以想到print()的默认参数:

print(self, *args, sep=' ', end='\n', file=None)

知识点:如果要实现单个语句的多个参数同行输出,可以通过对默认参数sep=' '进行更改;如果要实现多个语句同行输出,可以通过对默认参数 end='\n'进行修改。
代码块1的循环中, print ('✮')实际被多次执行,实际为多个语句,所以需要对end='\n'进行修改。'\n'表示换行,那我们只要改为空格即可实现:' '。(注:此处引号内实际为一个空格键)让我们再执行一次修改后上述代码:

#代码块2
i = 1
while i <= 5:
    print ('✮',end=' ')   #不换行输出
    i += 1
    
#此时实际输出的就是我们想要的结果:
✮ ✮ ✮ ✮ ✮ 

在以上操作的基础上,如果让你输出一个由'✮'组成的正方形该如何实现呢?

这时我们可以思考一下,把代码块2看做一个整体,即可同行输出五个'✮',那我们只要将代码块2重复执行五遍是不是就可以实现了呢?于是,我们需要在此基础上为代码块2增加一个外循环的结构即可。为了方便理解,我们先写一个循环的结构出来:

#代码块3
j=1
while j <= 5:
    print('*')
    j+=1
    
#这里实现的是将'*'打印五遍:
*
*
*
*
*

是不是和打印'✮'的结构一样?只不过此处是分行输出。这个时候我们只要将代码块2嵌入到上面的代码块3中就可以实现输出一个由'✮'组成的正方形。如何嵌入呢?只要将上面的print()内容替换掉即可:

#代码块4
j=1
while j <= 5:  
    #将*代码块2*嵌入
    i = 1 
    while i <= 5:
        print ('✮', end=' ')
        i += 1
    
    j+=1
    
#但是此时并未如我们所想,输出一个由'✮'组成的正方形`
✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ 

为什么这样呢?我们仔细观察一下。一共输出了25个'✮ ',且是同行输出,也就是说代码块4实际仅实现了代码块2同行的五遍输出。于是,我们只要将同行改为换行即可,对不对?可我们是将代码块2看做了一个整体,没有可直接修改的print()语句怎么办?

我们可以思考一下,内循环每次执行输出后没有换行,我们是不是可以让它在每次执行完输出后强制换行呢?于是我们根据程序自上而下运行的逻辑,在内循环每次执行输出后执行一次换行的打印即可,即增加一个print()语句。

#代码块5
j=1
while j <= 5:
    i = 1
    while i <= 5:
        print ('✮', end=' ')
        i += 1
    print()    #增加print()强制换行
    j+=1
    
#此时即是完美结果:
✮ ✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ 

此时我们回顾一下整体的逻辑:

1.内循环控制每行输出;通过 i += 1实现数量递增;

2.外循环控制每列输出;通过j += 1实现数量递增;

3.当外循环j=1时,内循环依次输出,内循环条件不满足时,跳出内循环,j进行+1;

当外循环j=2时,内循环依次输出,内循环条件不满足时,跳出内循环,j进行+1;

依次类推,直至外循环不满足条件时,结束整个循环。

让我们通过debugger工具(可登入:https://pythontutor.com/pytho... 使用)来看一下代码实现的具体步骤:
https://www.bilibili.com/vide...
我们有也可以通过图表模型看一下:

通过以上操作,相信让你输出一个正方形应该可以信手拈来。
那我们再进一步思考一下,三角形该如何输出呢?
我们可以通过观察以上图表可以看出,当j=i时,可以连接成一条自左上到右下的对角连线,这条连线可以把正方形均分为两个三角形。
分割线的左下部分,每个圆形内都是j>i;右上部分,每个圆形内都是j<i。
所以,如果在代码块5中,内循环的基础上增加一个控制j和i大小比较的条件,是不是就可以实现三角形打印了呢?

我们可以尝试一下:

#代码块6
j = 1
while j <= 5:
    i = 1
    while i <= j:                #控制j和i大小比较的条件
        print ('✮', end=' ')
        i += 1
    print ( )
    j += 1
#输出结果:
✮ 
✮ ✮ 
✮ ✮ ✮ 
✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ 

当然,我们还可以通过控件j和i大小比较的条件实现不同尺寸和形状三角形的输出,这里就不一一演示 了,有兴趣的可以在代码块6的基础上自行尝试。

通过以上操作,我们顺利实现了三角形的打印,大家有没有发现,三角形的阶梯结构和''九九乘法口诀表''的结构很类似?
image.png

我们在代码块6中输出的是5列,如果要实现乘法表的9列,是不是更改一下j的数据就可以了呢?我们试一下:

#代码块7
j = 1
while j <= 9:       #改为输出9列
    i = 1
    while i <= j:
        print ('✮', end=' ')
        i += 1
    print ( )
    j += 1
    
#实现结果是这样的:
✮ 
✮ ✮ 
✮ ✮ ✮ 
✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ 
✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ ✮ 

那进一步,我们在代码块7中输出的是'✮ ',我们用乘式替换掉'✮' 呢?

#代码块8
j = 1
while j <= 9:
    i = 1
    while i <= j:
        print (f'{i}*{j}={i*j}', end=' ')   #乘式替换掉'✮'
        i += 1
    print ( )
    j += 1
    
#结果如下:
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 

细心的同学可以发现,此处对齐不统一。这是因为我们每个乘式输出后设定的是以end=' '结束,空间间隔虽保持了一致,但因为下面的乘式中字符大小发生了变化,导致对齐不统一。此时我们可以通过改为制表符来调整:

#代码块9
j = 1
while j <= 9:
    i = 1
    while i <= j:
        print (f'{i}*{j}={i*j}',end='\t')  #调整间隔符为制表符
        i += 1
    print ( )
    j += 1
    
#此时输出如下:
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    

如还有对正不一致情况,为网页显示问题,实际输出如下图:
image.png

此时是不是就完成了''九九乘法口诀表''的输出。

我们以上仅为通过while循环控制的运算逻辑,下期我们分析通过for循环进行运算。于此同时,以上代码还有可以优化的地方,欢迎大家一起讨论学习!下期见!


自强自立
1 声望0 粉丝