本系列为《编写高质量代码-改善Python程序的91个建议》的读书笔记。
温馨提醒:在阅读本书之前,强烈建议先仔细阅读:PEP规范,增强代码的可阅读性,配合优雅的pycharm编辑器(开启pep8
检查)写出规范代码,是Python
入门的第一步。
建议8:利用assert语句来发现问题
- 断言(
assert
)基本语法如下:
assert expression1 ["," expression2]
assert
用法举例:
>>> x = 1
>>> y = 2
>>> assert x == y , "not equals"
Traceback (most recent call last):
File "<input>", line 1, in <module>
AssertionError: not equals
- 关于
assert
的几点说明事项
1)
__debug__
的值默认为True
,且只读,无法修改(Python2.7
)。
2)断言是有代价的,对性能产生一定影响。禁用断言的方法是在运行脚本的时候加上-O
标记(不优化字节码,而是忽略与断言相关的语句)。
- 使用断言(
assert
)注意点:
1)不要滥用,这是使用断言最基本的原则;
2)如果Python
本身的异常能够处理就不要再使用断言;
3)不要使用断言来检查用户的输入;
4)在函数调用后,当需要确认返回值是否合理时可以使用断言;
5)当条件时业务逻辑继续下去的先决条件时,可以使用断言。
建议9:数据交换值时不推荐使用中间交换变量
>>> from timeit import Timer
>>> Timer('temp=x;x=y;y=temp','x=2;y=3').timeit()
0.03472399711608887
>>> Timer('x,y=y,x','x=2;y=3').timeit()
0.031581878662109375
- 测试用例说明:不借助中间变量的方式耗费的时间更少,代码简洁,值得推荐。
建议10:充分利用Lazy evaluation的特性
Lazy evaluation
常被译作“延时计算
”或“惰性计算
”,指的是仅仅在真正需要执行的时候才计算表达式的值。典型例子:生成器表达式。
1)避免不必要的计算,带来性能上的提升;
2)节省空间,使用无限循环的数据结构成为可能。
- 实例:
#!/usr/bin/env python
# coding:utf-8
from itertools import islice
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a+b
if __name__ == '__main__':
print(list(islice(fib(), 5)))
建议11:理解枚举替代实现的缺陷
1)替代方法
- 使用类属性
>>> class Seasons(object):
... Spring, Summer, Autumn, Winter = xrange(4)
...
>>> print(Seasons.Spring)
0
- 借助函数
>>> def enum(*args, **kwargs):
... return type("Enum", (object,), dict(zip(args, xrange(len(args))), **kwargs))
...
>>> Seasons = enum("Spring", "Summer", "Autumn", Winter