# 九九乘法表
for i in range(1, 10):
for j in range(1, i+1):
print('{}x{}={}\t'.format(j, i, i*j), end='')
print()
△代码来源:菜鸟教程-九九乘法表 https://www.runoob.com/python3/python3-99-table.html
执行以上代码输出结果为:
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
知识点:range()函数
关于range()函数有一点想特别留意一下:
>>>range(10) # 从 0 开始到 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1,10) # 从 1 开始到 9
[1, 2, 3, 4, 5, 6, 7, 8, 9]
range()函数返回的结果是一个整数序列的对象,而不是列表。
>>> type(range(10))
<class 'range'>
编译环境 https://c.runoob.com/compile/6
图中的 重点 是 Retrun a list .......所以,range()返回的[]并不是列表,但我们可以利用list()函数返回列表:
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
知识点:end=' '
在 九九乘法表 的例子下面“官方”是这样解释的:通过指定end参数的值,可以取消在末尾输出回车符,实现不换行。
换言之,就是末尾end传递一个空字符串,这样print函数不会在字符串末尾添加一个换行符,而是添加一个空字符串,其实这也是一个语法要求,表示这个语句没结束。毕竟在print()函数里默认的是end='\n'。
所以,end=''用在print()里就会起到这样的效果:末尾不换行,加空格。
只不过需要特别注意的是,这个规则好像只适用于python3,python2好像并没有提出这一点。
扩展:关于 九九乘法表 解题过程中某些令人“眼前一亮”的思路
#!/usr/bin/python3
class multiplicationTable():
def paint(self,n=9):
for row in range(1,n+1):
for col in range(1,row+1):
print("{1}x{0}={2}\t".format(row , col , row*col),end='')
print();
table = multiplicationTable()
table.paint()
#table.paint(10) #打印 "10x10" 的乘法表
△老陌觉得这里有一个地方写得挺出彩的!在定义paint()函数的时候用到了(self,n=9)这相当于默认了“九九乘法表”,但是最后可以通过调用table.paint(n)来改变乘法表的范围,这样就有了“封装”的思维在里面,是个很不错的想法!
# 九九乘法表
for i in range(1, 10):
for j in range(1, i + 1):
if i == j:
print('{1}×{0}={2}'.format(i, j, i * j))
else:
print('{1}×{0}={2}'.format(i, j, i * j), end='\t')
# 有效去除每一行的最后一个空格
△这里基本的解题思路并没有改变,但是对于平方的那个乘积做了一点格式上的调整:去除了每一行的最后一个\t, 分类讨论 的想法让这个程序更加“精炼”了,而这个思路同样让人眼前一亮!
for i in range(1,10):
for j in range(1,i+1):
print "%dx%d=%d" % (j,i,j*i),
print
△这里主要用到的是print()中的占位符,和{}的写法其实异曲同工,在此不再赘述,只是想特别强调一下这段代码在两个print中间是有一个“,”的,老陌对此的理解是print默认的是end='\n',加一个逗号就变成了空格。遍历完了j再去做下面的print就相当于是一个换行:即,遍历完了j之后进入外层的i的循环。
p.s.这里的理解可能比较片面,如有想法欢迎下方留言一起交流呀~
总之,逗号在print()里的写法也挺有“技巧”的,值得记录下来。
>>> print '\n'.join(['\t'.join(['%d * %d = %d'%(y,x,x*y) for y in range(1,x+1)])for x in range(1,10)])
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
△这一段利用的是两个join()函数的嵌套,其中join()函数的语法:
'sep'.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
具体解题思路其实和上面几个大同小异,单独列出来是想再次复习一下python的代码风格:后面跟着的两个for循环其实是从内往外层写的,有别于正序的从外往内写的双层循环。
for 行 in range(1,10):
for 列 in range(1,行+1): # 内循环中,确保列 <= 行。
print("{}*{}={}\t".format(列,行,列*行),end="") # 确保同一行内容连续
print() # 另起一行!!!
input() # 防止程序一闪而过,不在编译器中也能使用
△这个解题思路其实也没什么变化,重点在于python中可以使用中文变量,这一点对于习惯使用中文的程序员而言算是比较友好的(对于从易语言转战python的码农而言也算是 python 的一个挺好的特性)。
参考资料:
菜鸟教程-range()函数用法 https://www.runoob.com/python/python-func-range.html
关于python中end函数的使用 https://blog.csdn.net/zhukerong0712/article/details/83750079
python中类似print(’*‘,end='')问题 https://blog.csdn.net/xuekunshan_/article/details/80451009
菜鸟教程-join()方法 https://www.runoob.com/python/att-string-join.html
python中join()函数的用法 https://www.cnblogs.com/jsplyy/p/5634640.html