标签:
原文发表在我的博客主页,转载请注明出处!
建议七:利用assert语句来发现问题
断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止意想不到的情况出现。其语法如下:
assert expression1 ["," expression2]
其中expression1的值会返回True或者False,当值为False的时候会引发AssertionError,而expression2是可选的,常用来传递具体的异常信息。
不过断言是有代价的,它会对性能产生一定的影响,对于编译型的语言,如C/C++,这也许并不那么重要,因为断言只在调试模式下启用。但python并没有严格定义调试和发布模式之间的区别,断言是被设计用来捕获用户所定义的约束的,而不是用来捕获程序本身的错误的,因此在使用时需要注意:
建议八:数据交换值的时候不推荐使用中间变量
在python中,更pythonic的实现数值交换的方式为:
x,y = y,x
不论从执行效率和代码简洁程度上来说,这种数值交换都是非常具有优势的。python的表达式计算的顺序一般情况下是从左到右,但遇到表达式赋值的时候表达式右边的操作数先于左边的操作数计算,因此对于上面的表达式,其在内存中执行的顺序如下:
1. 先计算右边的表达式y,x,因此先在内存中创建元祖(y,x)
2. 计算表达式左边的值并进行赋值,元祖被依次分配给左边的标识符,通过解压缩(unpacking),元祖第一标识符(为y)分配给左边第一个元素(x),第二个类似,这样达到x,y值交换的目的。
建议九:充分利用Lazy evaluation的特性
Lazy evaluation常被翻译为“延迟计算”或“惰性计算”,指的是仅仅在真正需要执行的时候才计算表达式的值,有两个好处:
def fib(): a, b = 0, 1 while True: yield a a, b = b, a+b
建议十:理解枚举替代实现的缺陷
1. 使用类属性
class Seasons: Spring, Summer, Autumn, Winter=range(4)
2. 借助函数
def enum(*posarg, **keysarg): return type("Enum", (object,), dict(zip(posarg, xrange(len(posarg))), **keysarg)) Seasons = enum("Spring", "Summer", "Autumn", Winter=1)
3. 使用collections.namedtuple
Seasons = namedtuple(‘Seasons’, ‘Spring Summer Autumn Winter’)._make(range(4))
建议十一:不推荐使用type来进行类型检查
内建函数type(object)用于返回当前对象的类型,因此可以通过与python自带模块types中所定义的名称进行比较,根据其返回值确定变量类型是否符号要求。例如判断一个变量a是不是list类型可以使用如下代码:
if type(a) is types.ListType:
所有基本类型对应的名称都可以在types模块中找到,如types.BooleanType、types.IntType、types.StringType、types.DictType等。但是为什么不推荐使用type来进行变量类型检查呢。
isinstance(object, classinfo) #其中,classinfo可以为直接或间接类名、基本类型名称或者由它们组成的元祖 #isinstance(2, float) False #isinstance("a", (str,unicode)) True
建议十二:尽量转换为浮点类型后再做出发
当涉及除法运算的时候尽量先将操作数转换为浮点类型的再做运算,比如:
a = float(4*3)/float(12*7)
不过python3已经不存在这个问题了,可以通过下面的语句使整数除法不再截断
from __future__ import division
另外需要注意对于浮点数的处理,其运算结果可能并不是完全准确的。
总结:编程语言通常都有其惯用法,掌握上面所述的这些惯用法是非常必要的。如果计算对精度要求较高,可以使用decimal来进行处理或者将浮点数尽量扩大为整数,计算完毕之后再转换回去,同时浮点数的比较同样最好能够指明精度。
参考:编写高质量代码–改善python程序的91个建议
标签:
原文地址:http://www.cnblogs.com/cotyb/p/5090332.html