首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每天读一本:Python高手之路

类的命名采用骆驼命名法,如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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180709G1GTJR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券