老代码:我们经常很熟练于下面的代码
temp = x
x = y
y = temp
代码一:
u, v, w = w, v, u
有人提出可以利用赋值顺序来简化上面的三行代码成一行
代码二:
u, v = v, u
其实利用Python元组赋值的概念,可更简明 – 元组初始化 + 元组赋值
d = { 'key': 'value' }
老代码:
if 'key' in d:
print (d['key'])
else:
print ('not find')
新代码:
print (d.get('key', 'not find'))
s = [ 4,1,8,3 ]
老代码:
mval, mpos = MAX, 0
for i in xrange(len(s)):
if s[i] < mval:
mval, mpos = s[i], i
新代码:
mval, mpos = min([ (s[i], i) for i in xrange(len(s)) ])
元组比较的特性,可以方便的写做一行
观点一:用Python编程,需要有“一字千金”的感觉;既然选择了Python,就不要在意单条语句的效率。
上面几点例子很基础,实际中将原始代码压缩1/5并不是不可能,我们之前一个子项目,C++代码270K
重构后Python代码只有67K,当然使用python的日志模块(logging),读写表格文本(csv)等,也功
不可末,最终代码变成原来的1/4,我觉得自己的寿命延长了三倍。。。下面优化几个常用代码:
老代码:我们需要将文本文件读入到内存中
line = ''
fp = open('text.txt', 'r')
for line in fp:
text += line
代码一:
text = string.join([ line for line in open('text.txt')], '']
代码二:
text = ''.join([ line for line in open('text.txt')])
代码三:
text = file('text.txt').read()
新版本的Python可以让你写出比1,2漂亮的代码(open是file的别名,这里file更直观)
老代码:用惯C++,Java,C#不喜欢写下面代码
if n >= 0:
print ('positive')
else:
print ('negitive')
代码一:该技巧在 Lua里也很常见
print ((n >= 0) and 'positive' or 'negitive')
说明:这里的’and’和’or’相当于C中的’:‘和’?‘的作用,道理很简单,因为如果表达式为
真了那么后面的or被短路,取到’positive’;否则,and被短路,取到’negitive’
代码二:
print ((n >= 0 and ['positive'] or ['negitive])[0])
说明:将两个值组装成元组,即使’positive’是None, ‘’, 0 之类整句话都很安全
代码三:
print (('negitive', 'positive')[n >= 0])
说明:(FalseValue, TrueValue)[Condition] 是利用了 元组访问 + True=1 两条原理
老代码:
if not y in d:
d[y] = { }
d[y][x] = 3
新代码:
d.setdefault(y, { })[x] = 3
如果成员是列表的话也一样: d.setdefault(key, []).append(val)
上面六点技巧加以发挥,代码已经很紧凑了,但是还没有做到“没有一句废话”可能有人怀疑真的能
减少1/5的代码么??我要说的是1/5其实很保守,Thinking in C++的作者后来用了Python以后觉得Python甚至提高了20倍的工作效率。
ok,文章分享到这里就结束了
对文章有问题,或者是自己有关python不懂的问题,都可以来这里哦 https://jq.qq.com/?_wv=1027&k=7Vp8wLlH 这里还有学习资料与免费课程领取