Effective python

时间:2020-08-29 14:41:57   收藏:0   阅读:51

目录

第一章:用pythonic的方式思考

1:确认使用的python版本

python --version
python3 --version

2:遵循PEP8风格指南

《Python Enhancement Proposal #8》又叫PEP8,它是针对Python代码风格而编订的风格指南。链接

采用一致的代码风格来书写可以令代码更加易懂、更加易读;

3:了解bytes、str与Unicode的区别

python2有两种表示字符的类型:str、Unicode;str包含原始的8位值,Unicode包含Unicode字符。

python3有两种表示字符的类型:bytes、str;bytes包含原始的8位值,str包含Unicode字符。

在编写程序时,一定要把编码、解码的操作放在界面最外围来做,程序的核心应该使用Unicode字符类型。

注意:

  1. python2中,如果str只包含7位ASCII字符,此时Unicode和str似乎就成了同一种类型,可以使用+、等价、不等价来判断str和Unicode,也可以使用%s来格式化Unicode。
  2. python3中,内置open函数默认会以utf-8编码格式来操作文件,python2中默认是二进制格式。

4:用辅助函数来取代复杂的表达式

总结下来就是:

5:了解切割序列的办法

6:在单次切片操作内,不要同时指定start、end和stride

7:用列表推导来取代map和filter

8:不要使用包含两个以上表达式的列表推导

9:用生成器表达式来改写数据量较大的列表推导

10:尽量用enumerate取代range

11:用zip函数同时遍历两个迭代器

12:不要在for和while循环后面写else块

13:合理利用try/except/else/finally结构中的每个代码块

第二章:函数

14:尽量用异常来表示特殊情况,而不要返回None

15:了解如何在闭包中使用外围作用域中的变量

去了解global和nonlocal的用法(nonlocal是python3的语法)

16:考虑用生成器来改写直接返回表聊得函数。

17:在参数上面迭代时,要多加小心

for x in foo会先调用iter(foo)返回一个迭代器对象,iter会调用foo.__iter__方法。

18:用数量可变的位置参数减少视觉杂讯

19:用关键字参数表达可选的行为

20:用None和文档字符串来描述具有动态默认值的参数

21:用只能以关键字形式指定的参数来确保代码明晰

第三章:类与继承

22:尽量用辅助类来维护程序的状态,不要用元组或者字典

23:简单的接口应该接收函数,而不是类的实例

24:以@classmethod形式的多态去通用的构建对象

25:用super初始化父类

26:只在使用Mix-in组件制作工具时进行多重继承

mix-in是一种小型的类,它只定义了其他类可能需要提供的一套附加方法,而不定义自己的实例属性,也不要求使用者调用自己的__init__方法。

27:多用public属性,少用private属性

28:继承collections.abc以实现自定义的容器类型

collections.abc模块定义了一系列抽象基类,它们提供了每一种容器类型所应该具备的常用方法。从这样的基类中继承之类之后,如果忘记实现某个方法,那么collections.abc模块就会指出这个错误。

第四章:元类及属性

29:用纯属性取代get和set方法

30:考虑用@property来代替属性重构

31:用描述符来改写需要复用的@property方法

32:用__getattr____get_attribute____setattr__实现按需生成的属性。

如果某个类定义了__getattr__,同时系统在该类对象的实例字典中又找不到待查询的属性,系统就会调用该方法。

33:用元类来验证子类

元类最简单的一种用途,就是验证某个类定义的是否正确。构建复杂的类体系时,我们可能需要确保类的风格协调一致、确保某些方法得到了覆写,或是确保类属性之间具备某些严格的关系。

34:用元类来注册子类

35:用元类来注解类的属性

第五章:并发及并行

36:用subprocess模块管理子进程

37:可以用线程来执行阻塞式io,但不要用它做平行计算

38:在线程中使用lock来防止数据竞争

39:用Queue来协调各线程之间的工作

40:考虑用协程来并发地运行多个函数。

虽然可以用开发多个线程来实现并发,但是线程有以下缺点:

  1. 为了确保数据安全,必须要使用同步工具。
  2. 线程需要占用大量内存,大约8M。
  3. 线程启动时的开销比较大。

41:考虑用concurrent.futures来实现真正的平行计算

第六章:内置模块

42:用functools.wraps定义函数装饰器

43:考虑以contextlib和with语句来改写可复用的try/finally代码

44:用copyreg实现可靠的pickle操作

45:应该用datetime模块来处理本地时间,而不是用time

time模块的实现依赖操作系统而运行,应该仅仅用来在UTC(时间戳)和当地时区时间之间转换。

46:使用内置算法与数据结构

双向队列:deque

有序字典:OrderedDict()

带有默认值的字典:defaultdict()

堆队列:heap

与迭代有关的工具:itertools

47:在重视精确度的场合,应该使用decimal

48:学会安装有python开发者社区所构建的模块

第七章:协作开发

49:为每个函数、类和模块编写文档字符串

50:用包来安排模块,并提供稳固的API

51:为自编的模块定义根异常,以便调用者与API相隔离

52:用适当的方式打破循环依赖关系

53:用虚拟环境隔离项目,并重建其依赖关系

第八章:部署

54:考虑用模块级别的代码来配置不同的部署环境

55:通过repr字符串来输出调试信息

56:用unittest来测试全部代码

57:考虑用pdb实现交互调试

import pdb
pdb.settrace()

58:先分析性能再优化

59:用tracemalloc来掌握内存的使用及泄露情况

原文:https://www.cnblogs.com/lit10050528/p/13581952.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!