有一次去面试,被问到了九九乘法口诀用代码如何实现 ?虽然当时已经做了出来,但是后来才知道,其实有更简单的方法,只需一行代码就可以实现 。
那么我们先来看下普通的实现方式,就是做个嵌套循环,然后打印两个数的乘积信息 。
for i in range(1,10): for j in range(i,10): print("{}×{}={}".format(i,j,j*i),end=" ") print(" ")
运行结果:
1×1=1 1×2=2 1×3=3 1×4=4 1×5=5 1×6=6 1×7=7 1×8=8 1×9=9 2×2=4 2×3=6 2×4=8 2×5=10 2×6=12 2×7=14 2×8=16 2×9=18 3×3=9 3×4=12 3×5=15 3×6=18 3×7=21 3×8=24 3×9=27 4×4=16 4×5=20 4×6=24 4×7=28 4×8=32 4×9=36 5×5=25 5×6=30 5×7=35 5×8=40 5×9=45 6×6=36 6×7=42 6×8=48 6×9=54 7×7=49 7×8=56 7×9=63 8×8=64 8×9=72 9×9=81
直到遇到了python的这个语法,才知道很多代码可以写的更加简洁,这个语法就是使用python的列表推导式。它可以将一个序列构建成另外一个新列表的结构体 。
语法格式如下:
[ expB for x in iterable expA ]
该表达式主要由三部分组成,分别是中间的循环体,循环体后的表达式A,循环体前的对x运算的表达式B。
- for x in iterable : 循环的是一个序列,包括字典,元组,字符串以及range()方法等。此循环体是最先被执行的。
- expA:主要是由if语句或for语句构成,如果是if语句,一般是将x进行条件筛选,符合条件的传递给expB参与运算,如果是for循环,那就是双层嵌套循环,这里需要注意的是,后面的for循环是内层循环体 。当然该表达式也可以省略 。
- expB:主要是对for循环中的x进行的最后的运算,可以是+,-,*,%,|,条件判断以及各种方法等 。
比如,我们要实现这样一个功能,1~5内的数,遇到双数+1,遇到单数-1,返回一个新列表,通过列表推导式就可以这样写
print([x+1 if x % 2 ==0 else x-1 for x in range(1,6)])#输出 : [0, 3, 2, 5, 4]
以上if条件为真,返回if前面的值,否则返回else后面的值。
知道以上这个原理后,我们就拿这个语法来实现下九九乘法口诀。首先我们知道它是两层嵌套循环 。所以,后面的部分就很好实现,具体如下:
for i in range(1,10) for j in range(i,10)
以上这句话的代码就等同于如下代码,写了个嵌套循环,但是循环内没有实际内容。
for i in range(1,10): for j in range(i,10): pass
接下来就是最关键的打印乘法口诀乘积的信息,我们这里先做个分析 ,在打印口诀的信息中,其实有这么两种情况:
- 如果j<9的话,打印两个数的乘积,再加个空格。print("{}×{}={}".format(i,j,j*i),end=" ") if j<9 ,说明:end=“ ”代表空格,如果没有这个参数,默认为回车换行 。
- 如果j=9的话,打印两个数的乘积,再加回车换行。else print("{}×{}={}".format(i,j,j*i))
把以上两种情况连接起来就是以下一句完整的代码,具体如下:
[ print("{}×{}={}".format(i,j,j*i),end=" ") if j<9 else print("{}×{}={}".format(i,j,j*i)) for i in range(1,10) for j in range(i,10)]
通过运行以上这行代码,也可以实现上面的打印效果 。
同理,这个语法其实不仅仅是只能实现以上需求,只要是循环的相关处理,其实都可以考虑使用它来进行实现 。