要求:

按照题图格式编写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