说明:增加代码的描述力,可以成倍减少你的LOC,做到简单,并且真切有力
观点:少打字=多思考+少出错,10代码行比50行更能让人明白,以下技巧有助于提高5倍工作效率 1. 交换变量值时避免使用临时变量:(cookbook1.1)
老代码:我们经常很熟练于下面的代码
temp = x
x = y
y = temp
代码一:
u, v, w = w, v, u
有人提出可以利用赋值顺序来简化上面的三行代码成一行
代码二:
u, v = v, u
其实利用Python元组赋值的概念,可更简明 -- 元组初始化 + 元组赋值 2. 读字典时避免判断键值是否存在:(cookbook1.2)
d = { 'key': 'value' }
老代码:
if 'key' in d: print d['key']
else: print 'not find'
新代码:
print d.get('key', 'not find') 3. 寻找最小值和位置的代码优化:
s = [ 4,1,8,3 ]
老代码:
mval, mpos = MAX, 0
for i in xrange(len(s)):
if s < mval: mval, mpos = s, i
新代码:
mval, mpos = min([ (s, i) for i in xrange(len(s)) ])
元组比较的特性,可以方便的写做一行
观点一:用Python编程,需要有“一字千金”的感觉;既然选择了Python,就不要在意单条语句的效率。
上面几点例子很基础,实际中将原始代码压缩1/5并不是不可能,我们之前一个子项目,C++代码270K
重构后Python代码只有67K,当然使用python的日志模块(logging),读写表格文本(csv)等,也功
不可末,最终代码变成原来的1/4,我觉得自己的寿命延长了三倍。。。下面优化几个常用代码: 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更直观) 5. 如何在Python实现三元式:
老代码:用惯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 两条原理 6. 避免字典成员是复杂对象的初始化:(cookbook1.5)
老代码:
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甚至提高了10倍的工作效率。下面的例子可以进一步说明: 例子1:把文本的IP地址转化为整数
说明:需要将类似'192.168.10.214'的IP地址转化为 0x0C0A80AD6,在不用 inet_aton情况下
当C++/Java程序员正为如何进行文本分析,处理各种错误输入烦恼时,Python程序员已经下班:
f = lambda ip: sum( [ int(k)*v for k, v in zip(ip.split('.'), [1