类的命名采用骆驼命名法,如CamelCase;异常的定义使用Error前缀(如适用的话);函数的命名使用小写字符,如separated_by_underscores;用下划线开头定义私有的属性或方法,如_private。
pylint(https://pypi.python.org/pypi/pylint),它支持PEP 8,默认可以执行更多检查,并且支持插件。
静态分析技术,也就是说,解析代码并分析代码而无需运行。
第 2 章 模块和库
下面是一些必须了解的标准库模块:
1、atexit允许注册在程序退出时调用的函数。
2、argparse提供解析命令行参数的函数。
3、bisect为可排序列表提供二分查找算法(参见10.3节)。
4、calendar提供一组与日期相关的函数。
5、codecs提供编解码数据的函数。
6、collections提供一组有用的数据结构。
7、copy提供复制数据的函数。
8、csv提供用于读写CSV文件的函数。
9、datetime提供用于处理日期和时间的类。
10、fnmatch提供用于匹配Unix风格文件名模式的函数。
11、glob提供用于匹配Unix风格路径模式的函数。
12、io提供用于处理I/O流的函数。在Python3中,它还包含StringIO(在Python 2中有同名的模块),可以像处理文件一样处理字符串。
13、json提供用来读写JSON格式数据的函数。
14、logging提供对Python内置的日志功能的访问。
15、multiprocessing可以在应用程序中运行多个子进程,而且提供API让这些子进程看上去像线程一样。
16、operator提供实现基本的Python运算符功能的函数,可以使用这些函数而不是自己写lambda表达式(参见8.3节)。
17、os提供对基本的操作系统函数的访问。
18、random提供生成伪随机数的函数。
19、re提供正则表达式功能。
20、select提供对函数select()和poll()的访问,用于创建事件循环。
21、shutil提供对高级文件处理函数的访问。
22、signal提供用于处理POSIX信号的函数。
23、tempfile提供用于创建临时文件和目录的函数。
24、threading提供对处理高级线程功能的访问。
25、urllib(以及Python 2.x中的urllib2和urlparse)提供处理和解析URL的函数。
26、uuid可以生成全局唯一标识符(Universally Unique Identifiers,UUID)。
事件驱动的框架,可以使用Twisted或者Circuits等。
将a和b容器串接在一起进行循环操作
for x in itertools.chain(a, b):
第 3 章 文档
Python中文档格式的事实标准是reStructuredText,或简称reST。它是一种轻量级的标记语言(类似流行的Markdown),在易于计算机处理的同时也便于人类读写。Sphinx是处理这一格式最常用的工具,它能读取reST格式的内容并输出其他格式的文档。
第 4 章 分发
简而言之,setuptools是目前分发库的主要选择,如今已经是Python分发工具的事实标准,但在未来要对distlib保持关注。
第 5 章 虚拟环境
virtualenv会创建lib/pythonX.Y目录并利用它自动安装setuptools和pip
最近,PEP 405定义的虚拟环境机制已经被Python 3.3接受。也就是说,虚拟环境的使用如此流行以至于如今它已经成为Python标准库的一部分。
venv模块是Python 3.3及以上版本的一部分,可以操作虚拟环境而无需使用virtualenv包或其他包。
构建虚拟环境现在变得非常简单:
$ python3.3 -m venv myvenv
激活虚拟环境的机制同前面描述的一样,通过执行source命令激活脚本:
$ source myvenv/bin/activate
(myvenv) $
venv模块的缺点就是它不会默认安装setuptools和pip。
大多数程序都要同时支持Python 2和Python 3,所以完全依赖venv不是最好的选择。最好的选择仍然是基于virtualenv。
第 6 章 单元测试
测试覆盖度:coverage模块
$ nosetests --cover-package=ceilometer --with-coverage tests/test_pipeline.py
tox的目标是自动化和标准化Python中运行测试的方式。基于这一目标,它提供了在一个干净的虚拟环境中运行整个测试集的所有功能,并安装被测试的应用程序以检查其安装是否正常。
默认情况下,tox可以模拟多种环境:py24、py25、py26、py27、py30、py31、py32、py33、jython和pypy!你甚至可以加入自定义的环境。
第 7 章 方法和装饰器
装饰器主要的应用场景是针对多个函数提供在其之前,之后或周围进行调用的通用代码。装饰器本质上就是一个函数,这个函数接收其他函数作为参数,并将其以一个新的修改后的函数进行替换。
第 8 章 函数式编程
Python标准库中的itertools模块也提供了一组非常有用的函数,也很有必要记住:
1、chain(*iterables)依次迭代多个iterables但并不会构造包含所有元素的中间列表。
2、combinations(iterable, r)从给定的iterable中生成所有长度为r的组合。
3、compress(data, selectors)对data应用来自selectors的布尔掩码并从data中返回selectors中对应为真的元素。
4、count(start, step)创建一个无限的值的序列,从start开始,步长为step。
5、cycle(iterable)重复的遍历iterable中的值。
6、dropwhile(predicate, iterable)过滤iterable中的元素,丢弃符合predicate描述的那些元素。
7、groupby(iterable, keyfunc)根据keyfunc函数返回的结果对元素进行分组并返回一个迭代器。
8、permutations(iterable[, r])返回iterable中r个元素的所有组合。
9、product(*iterables)返回iterables的笛卡儿积的可迭代对象,但不使用嵌套的for循环。
10、takewhile(predicate, iterable)返回满足predicate条件的iterable中的元素。
这些函数在和operator模块组合在一起时特别有用。当一起使用时,itertools和operator能够覆盖通常程序员依赖lambda表达式的大部分场景
第 9 章 抽象语法树
抽象语法树(Abstract Syntax Tree,AST)是任何语言源代码的抽象结构的树状表示。
了解Python抽象语法树的最简单的方式就是解析一段Python代码并将其转储从而生成抽象语法树。要做到这一点,Python的ast模块就可以满足需要。
>>> import ast
>>> ast.dump(ast.parse("x = 42"))
"Module(body=[Assign(targets=[Name(id='x', ctx=Store())], value=Num(n=42))])"
第 10 章 性能与优化
性能分析工具cProfile
$ python -m cProfile myscript.py
cProfile生成的性能分析数据很容易转换成一个可以被KCacheGrind读取的调用树。cProfile模块有一个-o选项允许保存性能分析数据,并且pyprof2calltree可以进行格式转换
$ python -m cProfile -o myscript.cprof myscript.py
$ pyprof2calltree -k -i myscript.cprof
dis模块是Python字节码的反编译器,用起来也很简单。dis.dis函数会反编译作为参数传入的函数,并打印出这个函数运行的字节码指令的清单
>>> import dis
>>> dis.dis(x)
Python提供了一个bisect模块,其包含了二分查找算法。bisect函数能够在保证列表有序的情况下给出要插入的新元素的索引位置。
更多的数据类型,如二叉树和红黑树。Python包blist和bintree就包含了用于这些目的的代码,不要开发和调试自己的版本。
blist是Python列表的替代品,可在修改大型列表时提供更好的性能。 blist包还提供sortedlist,sortedset,weaksortedlist,weaksortedset,sorteddict和btuple类型。
memory_profiler检测内存使用情况:
$ python -m memory_profiler object.py
CPython的一个众所周知的性能瓶颈是全局解释器锁(Global Interpreter Lock,GIL)。两个线程不能在同时执行Python字节码。然而,这个限制只在两个线程执行纯Python代码时有影响。如果大多数处理时间花在函数调用上,并且这些函数释放了GIL,那么GIL并非性能瓶颈。例如,大多数I/O函数都会释放GIL。
multiprocessing模块可以很容易地用来绕过GIL。另一个稍微复杂的方式是编写异步代码。Twisted、Tornado和Tulip都是利用了这一技术的面向网络的库(java netty也是事件驱动的)。
第 11 章 扩展与架构
因为GIL的问题,多线程并非好的可扩展性方案,多线程的替代品:
(1)如果需要运行后台任务,最容易的方式是基于事件循环构建应用程序。许多不同的Python模块都提供这一机制,甚至有一个标准库中的模块——asyncore,它是PEP 3156中标准化这一功能的成果。有些框架就是基于这一概念构建的,如Twisted。最高级的框架应该提供基于信号量、计时器和文件描述符活动来访问事件。
在Unix中,用于构建这种事件循环的标准函数是系统调用select(2)或者poll(2)。它们会对几个文件描述符进行监听,并在其中之一准备好读或写时做出响应。
在Python中,这些系统调用通过select模块开放了出来。
Twisted多年来在这方面已经成为了事实上的标准。也有一些提供了Python接口的C语言库(如libevent、libev或者libuv)也提供了高效的事件循环。
(2)如果需要分散工作负载,使用多进程会更简单有效:Python中提供的multiprocessing包(多进程方案不适用于需要频繁创建、销毁进程的场景中,如接收并处理网络请求)
第 13 章 Python 3支持策略
许多函数不再返回列表而是返回可迭代对象(如range)。此外,字典方法(如keys或者items)现在也返回可迭代对象,而函数iterkeys和iteritems则已经被删除。
six模块对于维护Python 2和3的兼容性很有用,他的名字来源于2乘以3等于6
领取专属 10元无门槛券
私享最新 技术干货