改善python程序的91个建议读书笔记12

第二章 编程惯用法

建议8:利用assert语句来发现问题

断言在很多语言中都存在,它主要为调试程序服务,能够快速方便的检查程序的异常或者发现不恰当的输入等。

assert语法如下

assert expression1 [“,” expression]

其中计算expression1的值会返回True或者False,当值为False的时候会引发AssertionError,而expression2是可选的,常用来传递具体的异常信息。实际在执行过程中调用了if __debug__ and not x== y: raise AssertionError(“notequals”)。__debug__的值默认设置为True,且是只读的。断言是有代价的,它会对性能有一定影响,对于编译型语言如C/C++这也许不重要,因为断言只在调试模式下启用,但python没有严格定义调试和发布之间的区别,但是运行.py文件时加上-O的参数,python–O test.py便可以禁用断言,忽略与断言相关的语句。

使用禁言需要注意以下几点:

(1).不要滥用,这是使用禁言最基本的原则。若由断言引发了异常,通常代表程序中村子bug。因此断言应该使用在正常逻辑不可达的地方和正常情况下总为真的场合。

(2).如果python本身能够处理的就不要使用断言。

(3).不要使用断言来检查用户的输入。

(4).在函数调用后,当需要确认返回值是否合理的时候可以使用断言。

(5).当条件是业务逻辑继续下去的先决条件时可以使用断言。

建议9:数据交换值的时候不推荐使用中间变量

我们可以直接使用x,y = y,x来实现交换值的功能,一般情况下python表达式计算的顺序是从左到右,但遇到表达式赋值的时候表达式右边的操作数先于左边的操作数计算,因此expr3,expr4 = expr1,expr2的计算顺序是expr1,expr2-> expr3,expr4。因此对于表达式x,y=y,x,先计算右边的表达式y,x,因此现在内存中创建元组(y,x),其标示符和值分别为y、x及其对应的值,其中y和x是在初始化时已经存在于内存中的对象。之后计算表达式左边的值进行赋值。

我们还可以更深入的通过python生成的字节码来分析,调用dis模块来实现。

建议10:充分利用Lazy evaluation的特性

Lazy evaluation指的是仅仅在真正需要执行的时候才计算表达式的值。

(1).避免不必要的计算,带来性能上的提升。

对于python中的条件表达式ifx and y,在x为false的情况下y的表达式的值将不再计算。对于ifx ory,当x的值为true的时候直接返回,不再计算y的值。如果对于or条件表达式应该敬爱那个值为真可能性较高的变量写在or前面,而and则应该推后。

(2).节省空间,使得无限循环的数据结构成为可能

python中Lazy evaluation最典型的例子就是生成器表达式,它仅在每次需要的时候才通过yield产生所需要的元素。

建议11:理解枚举替代实现的缺陷

对于枚举最经典的例子大概就是季节和星期莫属了,它能够以更接近自然语言的方式来表达数据。python3.4以前是不提供枚举的,但我们有各种替代实现方式。

(1).使用类属性

class Seasons:spring= 0    summer= 1    autumn= 2    winter= 3print Season.spring

(2).使用collections.namedtuple

人只要不失去方向,就不会失去自己

改善python程序的91个建议读书笔记12

相关文章:

你感兴趣的文章:

标签云: