要求:
按照题图格式编写99乘法表
分析:
1、python是面向对象编程的,有句话说的好:世界万物皆为对象,一切对象皆可分类。以99乘法表看做一个要处理的对象,我们可以将要做的事分为两类,一类是显示出一个直角三角形的阶梯框架,另一类是在阶梯中填入等式。
2、先做第一类,图示有9行阶梯,每行表示的等式个数依次增加,如果把每一个框架表示成一个星星,那么就是这样的:
*
**
***
****
*****
******
*******
********
*********
2.1、首先有9行,我们首先想到的是利用range()函数可以打印9行:
>>>for i in range(1,10):
>>> print(i)
1
2
3
4
5
6
7
8
9
2.2、但有么有别的办法呢,有,我们可以利用while循环,让它计算line -=1,line = 9, 依次减去1,然后打印出每一个结果,直到line为0时停止:
>>>line = 9
>>>while line>0 :
tmp = line - 1
print (tmp)
line -=1
9
8
7
6
5
4
3
2
1
2.3、我们发现跟上面一样,那么我如何让那一系列数字在一行上面表示呢,python中print()默认就是换行打印,如果想要打印的东西显示在一行中可以把print()表示成这样:print(,end=""),其中end=""中引号内可以添加任何符号,只表示间隔:
>>>line = 9
>>>while line>0 :
tmp = line - 1
print (tmp, end=" ")
line -=1
9 8 7 6 5 4 3 2 1
2.4、如上面表示的那样,打印出来的数字就在一行中显示了出来。但是问题来了,我如何在既显示9行又在每一行显示多个等式呢。这时候循环体的作用就表现出来了,我么可以采用循环嵌套的方式来表示。
line = 9
while line > 0 :
tmp = line
while tmp > 0:
print(tmp,end = ' ')
tmp -= 1
print (tmp)
line -= 1
9 8 7 6 5 4 3 2 1 0
8 7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
6 5 4 3 2 1 0
5 4 3 2 1 0
4 3 2 1 0
3 2 1 0
2 1 0
1 0
2.5、哈哈,果然出现了直角三角形,但是为什么会在每一行后面多了一个0呢?查看代码发现并没有什么问题,难道是循环体中print(tmp)出现了问题,试一试,还真的,这是因为在嵌套循环体中最后一步tmp=0,在后续print(tmp)时会把tmp=0打印出来,因此只需要将print (tmp)替换为print()即可。
line = 9
while line > 0 :
tmp = line
while tmp > 0:
print(tmp,end=' ')
tmp =tmp-1
print ()
line -=1
9 8 7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
7 6 5 4 3 2 1
6 5 4 3 2 1
5 4 3 2 1
4 3 2 1
3 2 1
2 1
1
2.6、可是现在是倒三角形,我怎么把它改成正的三角形呢。观察上面我们发现初始值line= 9,如果我么把初始值line= 1,然后让line自增,加到9为止不就可以解决问题了么。试一试:
line = 1
while line < 10 :
tmp = line
while tmp < 10:
print(tmp,end=' ')
tmp =tmp+1
print ()
line +=1
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9
4 5 6 7 8 9
5 6 7 8 9
6 7 8 9
7 8 9
8 9
9
2.7、结果然并卵,只是把原来的数字颠倒了顺序而已。那该怎么做?我们注意到,在代码第三行我们并没有改变tmp的值,依然是tmp=line,这就使得在嵌套循环中tmp的值始终是在line的基础上+1,然后加至9停止,因此tmp的值应该从1开始,这样就可以得到每一行从1开始的图形。但是,tmp从1开始里面的while循环也是从1开始,那么这样一来就会每一行都都打印9个数:
line = 1
while line < 10 :
tmp = 1
while tmp < 10 :
print(tmp,end=' ')
tmp =tmp+1
print ()
line +=1
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
2.8、这可不是我们想要的,但是好像离我们的目标更近了,只要把每一行大于行数的数字去掉就可以了。掌管行中数字的是嵌套循环中的while语句,我们注意到tmp<10的情况下一直运行,想要实现目标,只需要tmp <= line即可,试一试:
line = 1
while line < 10 :
tmp = 1
while tmp <= line :
print(tmp,end = ' ')
tmp = tmp+1
print ()
line += 1
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
看,多么完美的图形,正三角形出现了。
3、正三角形出现了,如何用三角形中的数字替代乘法等式呢?
3.1、我们注意到,打印每一行中的数字内容的其实是while循环中的自循环中的print()控制的,想要打印第一行,我们只需要用line*tmp即可:
line = 1
while line < =9:
tmp = line+1
print(line,'*',tmp,'=',line*tmp,end=' ')
line += 1
1 * 2 = 2 2 * 3 = 6 3 * 4 = 12 4 * 5 = 20 5 * 6 = 30 6 * 7 = 42 7 * 8 = 56 8 * 9 = 72 9 * 10 = 90
可以利用上面的格式替换别的数字:
first =1
while first <= 9:
sec =1
while sec <= first:
print(str(sec)+'*'+str(first)+'='+str(sec*first),end=' ')
sec += 1
print(" ")
first += 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
一份完整的乘法表出来了。实际上还有更好的方案:
for i in range(1,10):
for j in range(1,i+1):
print('%d*%d=%d' % (i,j,i*j),end=" ")
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