python实现九九乘法表代码解释_浅析⼀句python代码成⽣九python基础代码大全加翻译
九乘法表
print('\n'.join([' '.join('%sx%s=%-2s'%(x,y,x*y) for x in range(1,y+1)) for y in range(1,10)]))北京达内教育集团
摩纳哥球队最近在oschina上看到段九九乘法表 的代码,如下:
print'\n'.join([' '.join(['%s*%s=%-2s'%(y,x,x*y) fory in range(1,x+1)]) forx in range(1,10)])
我稍微调整了⼀下:
#coding:utf-8
print('\n'.join([' '.join('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)]))
恩,其实两代码都参不多,那么我们就来解析⼀下,这段代码:
⾸先:要使⽤的主要知识点:
1 列表解析知识(以及元组知识)
电脑总是弹出error
2 range,xrange,join函数的使⽤
3 字符串格式化输出
列表解析知识(以及元组知识)
语法:(转⾄ 猪跑Lazy)
1 [expr for iter_var in iterable]
2 [expr for iter_var in iterable if cond_expr]
第⼀种语法:⾸先迭代iterable⾥所有内容,每⼀次迭代,都把iterable⾥相应内容放到iter_var中,再在表达式中应⽤该iter_var的内容,最后⽤表达式的计算值⽣成⼀个列表。
第⼆种语法:加⼊了判断语句,只有满⾜条件的内容才把iterable⾥相应内容放到iter_var中,再在表达式中应⽤该iter_var的内容,最后⽤表达式的计算值⽣成⼀个列表。
⽐如⼀个简单的:
l =[y for y in xrange(1,10)]
print(l) #输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]
多个for循环的:
l =[(x,y) for x in xrange(1,3) for y in xrange(1,5)]
print(l) #输出:[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]
从这⾥可以看出来:这两个for 是嵌套的循环执⾏的。
到这⾥,我们的代码就可以做第⼀次拆分了:[ '%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1) for y in xrange(1,10)],
('%sx%s=%-2s'%(x,y,x*y)实际上就是⼀段表达式,所表⽰的意义稍后说明)当然这段代码是不会正常运⾏的,原因我想你应该知道:第⼀个for在y时没有到,因为从没有定义过(NameError: name 'y' is not defined)。
那么我们得让第⼀个for相对于第⼆个for⽽⾔也是⼀个运算表达式,那么我们使⽤⽣成器表达式,即“()”。
[ ('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)]
range,xrange,join函数的使⽤
另外使⽤⽣成器表达式还有⼀个好处是:⽣成器表达式使⽤了“惰性计算”(lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调⽤call by need的⽅式翻译为惰性更好⼀些),只有在检索时才被赋值( evaluated),所以在列表⽐较长的情况下使⽤内存上更有效(来⾄:猪跑Lazy)。实际上:range与xrange的区别也是这⼀点,所以在需要⼤序列时使⽤xrange要好于range,另外xrange,range产⽣的序列都是左闭右开区间的(y+1的原因)。
[('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)]运算后,会产⽣类似这样的序列:[['1x1=1 '], ['1x2=2 ', '2x2=4 '], ['1x3=3 ', '2x3=6 ', '3x3=9 '].............⼀个⼆维数组。
sql中select命令基本格式是
我们进⼀歩使⽤join函数来处理最⾥层的数组让其形成:'1x2=2 2x2=4 ','1x3=3 2x3=6 3x3=9 '........那么代码如下:
[' '.join('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)]
运⾏后产后这样的结果:
['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']
另外注意join函数的使⽤⽅式:join是string的⼀个成员函数,不是⼀个普通函数,所以不能直接这样使⽤join(source)。恩,你也可以这样分割列表:'|'.join(list),另外也注意os.path.join()的⽤法。
批处理文件怎么写使屏幕
字符串格式化输出
好了,我们再来说说:'%sx%s=%-2s'%(x,y,x*y),这⾥格式化输出的⽅式,以前我写过⼀篇《PHP如何显⽰(输出)两位⼩数(prinrf()函数简说)》
这⾥主要说说'-'这个符号,这个是⼀个转换标志,相应的还有:'-' 表⽰左对齐,+表⽰在转换值之前要加上正负号,“”空⽩字符表⽰正数之前保留空格,0 (零)表⽰转换值若位数不够则⽤0填充。
另外,使⽤' '.join()的原因就是 '%-2s' 这个产⽣空格分割符。
好了,最后运⾏:print('\n'.join([' '.join('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)])) 产⽣结果:
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
注:python3的range就是xrange

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。