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)

打印结果:

99乘法表的打印 python python打印99乘法表讲解_列表

关于编写思路以及涉及到的知识点详解

99乘法表的打印 python python打印99乘法表讲解_python_02

这里要涉及到两个for循环的嵌套,分别是x和y,如图所示。首先先确定输出的格式:

99乘法表的打印 python python打印99乘法表讲解_python_03


用代码形式为:

'%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

99乘法表的打印 python python打印99乘法表讲解_字符串_04


输出结果为:

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循环的嵌套

关于列表推导式这里列出三个例子来代表三种形式:

  1. [expr for iter_var in iterable]
    用iter_var迭代iterable里的内容,每迭代一次,将iter_var 赋给表达式expr,通过expr的计算值生成一个列表
  2. [expr for iter_var in iterable if cond_expr]
    用iter_var迭代iterable里的内容,每一次迭代将满足if判断语句中的iter_var,赋给表达式expr,通过expr的计算值生成一个列表
  3. [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'