前言
Python是一门强大的编程语言,它很有魅力,同时也很独特,所以掌握起来或许有点儿困难。许多程序员从他们熟悉的语言转到Python之后都打不开思路,所以写出来的代码没有充分发挥出Python的特性。还有一些程序员则相反,他们会滥用Python的特性,这样写出来的程序以后可能会出现严重的问题。
本书会详细地告诉大家如何采用符合Python风格的方式(Pythonic方式)来编写程序,这是使用Python语言的最佳方式。笔者假设你对这门语言已经有了初步了解。编程新手可以通过这本书学到各种Python功能的最佳用法,有经验的程序员则能够学会如何自信地运用Python中的新工具。
笔者的目标是让大家用Python开发出优秀的软件。
本书涵盖的内容
本书每一章都包含许多相互关联的条目。大家可以按照自己的需要随意阅读这些条目。每个条目都包含简洁而明确的教程,告诉你如何才能更有效率地编写Python程序。笔者在每个条目里都给出了建议,告诉大家哪些应该做,哪些应该避免,以及怎样在各种做法之间求得平衡,并且会解释笔者所选的做法好在哪里。笔者可能会在某个条目中提到其他一些条目,让大家可以全面地了解这些建议所涉及的知识。
本书第2版只针对Python 3(参见第1条),这里说的Python 3包含从3.0到3.8的各个版本。本书第1版中的许多条目仍然收录在第2版中,并且做了修订,其中有些条目改动比较大。随着Python语言越来越成熟,最佳编程方法也在演变,所以笔者在第2版中对某些问题的建议,可能与第1版的完全不同。Python 2已经在2020年1月1日退场,如果你还是主要在用这个版本来编程,那么第1版中的建议或许比第2版中的建议更加合适。
Python采用“自带电池”(batteries included)的理念来设计标准库,不像其他语言那样只提供少数几个常用的软件包,如果需要的重要功能不在这些软件包里,那就要自己去寻找了。许多Python内置软件包与Python的习惯用法有着密切的关系,所以实际上已经成了语言规范的一部分。本书篇幅有限,不可能把所有的标准模块全都讲一遍,但会涵盖其中那些需要了解和使用且用法比较关键的模块。
第1章:培养Pythonic思维
Python开发者社区用Pythonic这个形容词来描述具有某种特定风格的代码。这种风格是大家在使用Python语言编程并相互协作的过程中逐渐形成的。本章讲解如何采用这样的风格编写常见的Python代码。
第2章:列表与字典
在Python语言中整理信息时,最常用的方法是把一系列数值保存到列表(list
)中。既然有列表,那就有另外一种跟它互补的结构,也就是字典(dict
),这种结构可以把它存储的查找键映射到对应的值上。本章讲解如何采用这些数据结构来编写程序。
第3章:函数
Python中的函数具备多种特性,这有助于简化编程工作。Python函数的某些性质与其他编程语言中函数的类似,但也有一些是Python独有的。本章介绍如何使用函数来表达开发者的意图,如何让代码更容易复用,以及如何减少bug。
第4章:推导与生成
Python有一种特殊的语法,可以迅速迭代列表(list
)、字典(dict
)与集合(set
),并据此生成相应的数据结构,这让我们能够在函数返回的这种结构上逐个访问根据原结构所派生出来的一系列值。本章讲解怎样利用这种机制来提升程序效率并降低内存用量,同时让代码变得更容易读懂。
第5章:类与接口
Python是面向对象的语言。用Python编程时,经常要编写新的类,而且还要定义这些类应该如何通过其接口以及继承体系与其他代码相交互。本章讲解怎样使用类来表达对象所应具备的行为。
第6章:元类与属性
元类(metaclass)与动态属性(dynamic attribute)都是很强大的Python特性,但它们也有可能会让程序出现古怪的行为与意外的效果。本章讲解这些机制的习惯用法,确保读者写出来的代码遵循最小惊讶原则(rule of least surprise)。
第7章:并发与并行
用Python很容易写并发程序,这种程序可以在同一时刻做许多件不同的事情。Python也可以通过系统调用、子进程以及C语言扩展来实现并行处理。本章介绍这些Python特性应该用在什么情况下。
第8章:稳定与性能
Python内置了一些功能与模块,可以让程序变得更加可靠。另外,Python还提供了一些工具,可以让我们轻松地提升程序的性能。本章讲解怎样用Python优化程序,让这些程序在正式的运行环境中表现得更加稳定、更加高效。
第9章:测试与调试
不管使用哪种语言编程,我们都应该把写出来的代码测试一下。但对于Python来说,还有个特殊的问题,那就是它所提供的动态机制可能会增加程序在运行时出现错误的风险。好在Python也让我们可以比较容易地编写测试代码和故障诊断程序。本章讲解怎样用Python内置的工具来测试并调试程序。
第10章:协作开发
如果许多人要协作开发一个Python程序,那就得仔细商量代码的写法了。即便你只是一个人开发,也需要了解如何使用其他人所写的模块。本章介绍标准的工具以及业界总结出来的最佳方法,告诉大家怎样协作开发Python程序。
本书使用的约定
本书采用特殊字体表示Python代码。如果某一句代码比较长,会用符号表示换行。代码中的某些部分如果跟当前要讲的主题关系不大,笔者会将这些代码删掉,并以省略号(...)表示。你可以访问“获取源代码及勘误表”部分提到的网址以获取完整的范例代码,这样就能在自己的电脑中正确地运行这些例子了。
笔者在Python风格指南[1]的基础上做了一些修改,让范例代码便于印刷,同时还可以强调其中的重要内容。为了缩减范例代码篇幅,笔者把内嵌的文档也删去了。你在开发自己的项目时不应该这样做,而是应该遵循Python风格指南(参见第2条),并且要在源代码中撰写开发文档(参见第84条)。
书中的大部分代码伴有运行之后产生的输出。这里说的输出,是指在交互式解释器中运行这些Python程序时,控制台或终端机所打印出的信息。这些输出信息也用特殊字体表示,它们上面的那一行标着>>>符号(Python解释器的提示符)。书中使用这个符号是想告诉大家:把>>>上方的范例代码输入Python shell(Python解释器的界面)之后,会产生与>>>下方一样的输出信息。
此外,还有一些文字上方虽然没有>>>符号,但也是以特殊字体表示的。这些内容是指Python解释器之外的输出信息。这些信息的上方通常有$字符,表示这是笔者在Bash之类的命令行界面中先运行了某个程序,然后才产生这些输出的。如果你是在Windows或其他类型的操作系统中运行程序的话,那么可能要相应调整程序名称与参数。
获取源代码及勘误表
大家拿到范例代码之后,可以抛开书中讲解代码的那些内容,单独把这个完整的程序运行一遍,这是很有好处的。你可以用这些代码做实验,并试着理解程序为什么会这样运行。所有的源代码都可以从本书网站(https://effectivepython.com/)下载[2],书中的勘误以及提交勘误的方法,也写在这个网站里[3]。
[1]也就是PEP 8 -- Style Guide for Python Code,参见:https://www.python.org/dev/peps/pep-0008/。——译者注
[2]也可以直接去https://github.com/bslatkin/effectivepython下载。——译者注
[3]可以直接去https://github.com/bslatkin/effectivepython/issues查看并提交勘误。——译者注