python实现一行代码打印九九乘法表,以及涉及到的知识点详解
实现结果
代码:
Haskell = '\n'.join([' '.join('%dx%d=%d ' % (x , y , x*y) for x in range(1,y+1)) for y in range(1,10)])
print(Haskell)
打印结果:
关于编写思路以及涉及到的知识点详解
这里要涉及到两个for循环的嵌套,分别是x和y,如图所示。首先先确定输出的格式:
用代码形式为:
'%dx%d=%d ' % (x , y , x*y)
关于python中“%”的使用,详见下方知识点1:关于%;
然后又了解了列表推导式(详见下方知识点2列表推导式),实现了打印九九乘法表的全部内容,写出了下行所示代码:
'%dx%d=%d' % (x , y , x*y) for y in range(1,10) for x in range(1,y+1)
因为考虑到每个等式之间有空格,并且还要换行,所以这里涉及到了join函数,详见下方知识点3:关于join函数
另外还有一个问题,因为使用“%字符串格式化处理”,它的结果是生成一个新的字符串,所以运行出来后所有的乘法公式是以一个字符串显示的,以一列形式输出,而九九乘法表是以阶梯状的形式呈现的,所以,这里出了问题。结合join函数我分析了一下之后明白了:两个等式之间的空格是随着x的变化而出现的,换行符是与y的值有关,所以,我通过join函数分别将“\t”与x连接,“\n”与y连接,这样的话,就要先执行x层循环,再执行y循环,于是得到以下最终代码:
'\n'.join([' '.join('%dx%d=%d ' % (x , y , x*y) for x in range(1,y+1)) for y in range(1,10)])
知识点1:关于%
1. 取模运算%
代表取模,返回被除法的余数。
- 例如:
print(5%2)
- 运行结果:
1
2.字符串格式化
表示字符串格式化操作,常用的操作有%s %d %f等。
简单的说,这是一种将其他变量置入字符串特定位置以生成新字符串的操作
比如:
idol = Jason Zhang
"My idol is %s" % idol
输出结果为:
My idol is Jason Zhang
这种操作还可以实现将其他数据类型或多个变量同时放进字符串中,如下所示:
>>> "My idol is %s"%"Jason_Zhang" #字符串
My idol is Jason_Zhang
>>> "%d年出生"%1982 #整数型
1982年出生
>>> "%s %d %f"%("Jason_Zhang",1982,3.14) #多个值
'Jason_Zhang 1982 3.140000'
知识点2:列表推导式
这里使用列表推导式来实现两层for循环的嵌套
关于列表推导式这里列出三个例子来代表三种形式:
- [expr for iter_var in iterable]
用iter_var迭代iterable里的内容,每迭代一次,将iter_var 赋给表达式expr,通过expr的计算值生成一个列表 - [expr for iter_var in iterable if cond_expr]
用iter_var迭代iterable里的内容,每一次迭代将满足if判断语句中的iter_var,赋给表达式expr,通过expr的计算值生成一个列表 - [expr for iter_var1 in iterable1 for iter_var2 in iterable2]
相当于如下的两层for循环:
for iter_var2 in iterable2:
for iter_var1 in iterable1:
expr……
三种语法的示例如下图:
list1 = [x*x for x in range(1,11)]
list2 = [x*x for x in range(1,11) if (x*x) %2 == 0]
list3= [(x+1,y+1) for x in range(2) for y in range(4)]
print("1-10的平方:{}".format(list1))
print("1-10的平方为偶数的有:{}(for循环嵌套if语句)".format(list2))
print("点坐标有:{}".format(list3))
输出结果:
1-10的平方:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
1-10的平方为偶数的有:[4, 16, 36, 64, 100](for循环嵌套if语句)
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]
知识点3:关于join函数
函数:string.join()
Python中有join()和os.path.join()两个函数,具体作用如下:
- join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
- os.path.join(): 将多个路径组合后返回
1.join()函数
语法:
“sep”.join(seq)
参数说明
sep:分隔符,可以为空
seq:要连接的元素序列:字符串、列表、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
#对字符串进行操作
>>> seq1 = "hello world!"
>>> print('!'.join(seq1))
h!e!l!l!o! !w!o!r!l!d!!!
#对列表进行操作(使用' '作为分隔符)
>>> seq2 = ['hello','world','zhang','jie']
>>> print(' '.join(seq2))
hello world zhang jie
#对元组进行操作
>>> seq3 = ('hello','world','zhang','jie')
>>> print(':'.join(seq3))
hello:world:zhang:jie
#对字典进行操作
>>> seq4 = {'hello':1,'world':2,'zhang':3,'jie':4}
>>> print(':'.join(seq4))
hello:world:zhang:jie
注意:若列表或元组内有非字符串内容(例如整数,会按照浮点数处理)无法使用join函数,报下面这个错误:
TypeError: sequence item 1: expected str instance, float found
解决办法:(1)可在生成列表前,先转换成字符串,然后保存在列表;
x,y = str(1),str(2)
list_label1.append(x)
list_label1.append(y)
print(a)
print(type(a[0]))
输出结果:
['1', '2']
<class 'str'>
(2)使用map函数,遍历列表中的每个元素进行str转变(示例代码如下:)
a = [1,2,3,"w"]
b = list(map(str,a))
print(type(a[0]))
print(type(b[0]))
输出结果:
<class 'int'>
<class 'str'>
2、os.path.join()函数
语法:
os.path.join(path1,path2)
返回值:将多个路径组合后返回
代码示例:
#合并目录
>>> import os
>>> os.path.join('/python/','item/','data')
'/python/item/data'