Python 2.7.6 官方教程中文版
排版 天涯客
本教程出自Python 中文学习大本营
(本文档由 LATEX 排版系统编辑而成, 编辑环境:TEXLive 2014 + TEXmaker)
2015-01-14
目 录
1 开胃菜
6
2 使用 Python 解释器
8
8
2.1 调用 Python 解释器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.1.1 参数传递 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.1.2 交互模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2 解释器及其环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2.1 错误处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2 执行 Python 脚本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2.3 源程序编码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.4 交互执行文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.5 本地化模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3 Python 简介
12
3.1 将 Python 当做计算器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.1.1 数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.1.2 字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.1.3 关于 Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.1.4 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2 编程的第一步 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4 深入 Python 流程控制
24
if 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.1
for 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.2
4.3
range() 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.4 break 和 continue 语句, 以及循环中的 else 子句 . . . . . . . . . . . . . . . . . . . . . . . . 26
4.5 pass 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.6 定义函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.7 深入 Python 函数定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.7.1 默认参数值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.7.2 关键字参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.7.3 可变参数列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.7.4 参数列表的分拆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2
目 录
3
4.7.5 Lambda 形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.7.6 文档字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.8 插曲:编码风格 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5 数据结构
35
5.1 关于列表更多的内容 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.1.1 把链表当作堆栈使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.1.2 把链表当作队列使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.1.3 函数式编程工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.1.4 列表推导式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.2 del 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.3 元组和序列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.4 集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.5 字典 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.6 循环技巧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.7 深入条件控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.8 比较序列和其它类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6 模块
47
6.1 深入模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.1.1 作为脚本来执行模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.1.2 模块的搜索路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.1.3
“编译的”Python 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.2 标准模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.3 dir() 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.4 包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.4.1 从 * 导入包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.4.2 包内引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.4.3 多重目录中的包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7 输入和输出
56
7.1 格式化输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
7.1.1 旧式的字符串格式化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.2 文件读写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.2.1 文件对象方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.2.2
pickle 模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
8 错误和异常
63
8.1 语法错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.2 异常 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.3 异常处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
8.4 抛出异常 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
8.5 用户自定义异常 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.6 定义清理行为 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4
目 录
8.7 预定义清理行为 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
9 类
71
9.1 术语相关 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.2 Python 作用域和命名空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.3 初识类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
9.3.1 类定义语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
9.3.2 类对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
9.3.3 实例对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
9.3.4 方法对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
9.4 一些说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
9.5 继承 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
9.5.1 多继承 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
9.6 私有变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
9.7 补充 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
9.8 异常也是类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
9.9 迭代器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
9.10 生成器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
9.11 生成器表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
10 Python 标准库概览
83
10.1 操作系统接口 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
10.2 文件通配符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
10.3 命令行参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
10.4 错误输出重定向和程序终止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
10.5 字符串正则匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
10.6 数学 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
10.7 互联网访问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
10.8 日期和时间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
10.9 数据压缩 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
10.10性能度量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
10.11质量控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
10.12“瑞士军刀” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
11 标准库浏览–Part II
89
11.1 输出格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
11.2 模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
11.3 使用二进制数据记录布局 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
11.4 多线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
11.5 日志 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
11.6 弱引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
11.7 列表工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
11.8 十进制浮点数算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
目 录
12 接下来?
5
97
13 交互式输入行编辑历史回溯
99
13.1 行编辑 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
13.2 历史回溯 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
13.3 快捷键绑定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
13.4 其它交互式解释器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
14 浮点数算法:争议和限制
102
14.1 表达错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
CHAPTER 1
开胃菜
如果你要用计算机做很多工作,最后你会发现有一些任务你更希望用自动化的方式进行处理。比如,
你想要在大量的文本文件中执行查找/替换,或者以复杂的方式对大量的图片进行重命名和整理。也许
你想要编写一个小型的自定义数据库、一个特殊的 GUI 应用程序或一个简单的小游戏。
如果你是一名专业的软件开发者,可能你必须使用几种 C/C++/JAVA 类库,并且发现通常编写/编
译/测试/重新编译的周期是如此漫长。也许你正在为这些类库编写测试用例,但是发现这是一个让人烦
躁的工作。又或者你已经完成了一个可以使用扩展语言的程序,但你并不想为此重新设计并实现一套全
新的语言。
那么 Python 正是你所需要的语言。
虽然你能够通过编写 Unix shell 脚本或 Windows 批处理文件来处理其中的某些任务,但 Shell 脚本
更适合移动文件或修改文本数据,并不适合编写 GUI 应用程序或游戏;虽然你能够使用 C/C++/JAVA
编写程序,但即使编写一个简单的 first-draft 程序也有可能耗费大量的开发时间。相比之下,Python 更
易于使用,无论在 Windows、Mac OS X 或 Unix 操作系统上它都会帮助你更快地完成任务。
虽然 Python 易于使用,但它却是一门完整的编程语言;与 Shell 脚本或批处理文件相比,它为编写
大型程序提供了更多的结构和支持。另一方面,Python 提供了比 C 更多的错误检查,并且作为一门高
级语言,它内置支持高级的数据结构类型,例如:灵活的数组和字典。因其具有更多的通用数据类型,同
Awk 甚至 Perl 相比较,Python 适用于更多领域,至少大多数事情在 Python 中与其他语言同样简单。
Python 允许你将程序分割为不同的模块,以便在其他的 Python 程序中重用。Python 内置提供了
大量的标准模块,你可以将其用作程序的基础,或者作为学习 Python 编程的示例。这些模块提供了诸
如文件 I/O、系统调用、Socket 支持,甚至类似 Tk 的用户图形界面 (GUI) 工具包接口。
Python 是一门解释型语言,因为无需编译和链接,你可以在程序开发中节省宝贵的时间。Python
解释器可以交互地使用,这使得试验语言的特性、编写临时程序或在自底向上的程序开发中测试方法非
常容易。你甚至还可以把它当做一个桌面计算器。
Python 让程序编写的紧凑和可读。用 Python 编写的程序通常比同样的 C、C++ 或 Java 程序更
短小,这是因为以下几个原因:
• 高级数据结构使你可以在一条语句中表达复杂的操作;
• 语句组使用缩进代替开始和结束大括号来组织;
• 变量或参数无需声明。
6
7
Python 是可扩展的:如果你会 C 语言编程便可以轻易的为解释器添加内置函数或模块,或者为了
对性能瓶颈作优化,或者将 Python 程序与只有二进制形式的库 (比如某个专业的商业图形库) 连接起
来。一旦你真正掌握了它,你可以将 Python 解释器集成进某个 C 应用程序,并把它当作那个程序的扩
展或命令行语言。
顺便说一句,这个语言的名字来自于 BBC 的“Monty Python’s Flying Cirecus”节目,和爬行类
动物没有任何关系。在文档中引用 Monty Python 的典故不仅可行,而且值得鼓励!
现在你已经为 Python 兴奋不已了吧,迫不及待地想要领略更多的细节!学习一门语言最好的方法
就是使用它,本指南推荐你边读边使用 Python 解释器练习。
下一节中,我们将解释 Python 解释器的用法。这是很简单的一件事情,但它有助于试验后面的例
子。
本手册剩下的部分将通过示例介绍 Python 语言及系统的诸多特性,开始是简单的语法、数据类型
和表达式,接着介绍函数与模块,最后涉及异常和自定义类这样的高级内容。
CHAPTER 2
使用 Python 解释器
2.1 调用 Python 解释器
Python 解释器通常被安装在目标机器的 /usr/local/bin/python 目录下。将 /usr/local/bin 目
录包含进 Unix shell 的搜索路径里,以确保可以通过输入
1 python
命令来启动它。由于 Python 解释器的安装路径是可选的,这也可能是其他路径,你可以联系安装
Python 的用户或系统管理员确认。(例如,/usr/local/python 就是一个常见的选择)
在 Windows 机器上,Python 通常安装在 C:\Python27 位置,当然你可以在运行安装向导时修改此
值。要想把此目录添加到你的 PATH 环境变量中,你可以在 DOS 窗口中输入以下命令
1
set path=%path%;C:\python27
通常你可以在主窗口输入一个文件结束符 (Unix 系统是 Control-D ,Windows 系统是 Control-Z
) 让解释器以 0 状态码退出。如果它不起作用,你可以通过输入 quit() 命令退出解释器。
Python 解释器具有简单的行编辑功能。在 Unix 系统上,任何 Python 解释器都可能已经添加了
GNU readline 库支持,这样就具备了精巧的交互编辑和历史记录等功能。在 Python 主窗口中输入
Control-P 可能是检查是否支持命令行编辑的最简单的方法。如果发出嘟嘟声 (计算机扬声器),则说明
你可以使用命令行编辑功能;更多快捷键的介绍请参考交互式输入行编辑历史回溯。如果没有任何声音,
或者显示 ^P 字符,则说明命令行编辑功能不可用;你只能通过退格键从当前行删除已键入的字符并重
新输入。
Python 解释器有些操作类似 Unix shell:当使用终端设备 (tty) 作为标准输入调用时,它交互地解
释并执行命令;当使用文件名参数或以文件作为标准输入调用时,它读取文件并将文件作为脚本执行。
第二种启动 Python 解释器的方法是 python -c command [arg] ... ,这种方法可以在命令行执
行 Python 语句,类似于 shell 中的 -c 选项。由于 Python 语句通常会包含空格或其他特殊 shell 字符,
一般建议将命令用单引号包裹起来。
有一些 Python 模块也可以当作脚本使用。你可以使用 python -m module [arg] ... 命令来调用
它们,这类似在命令行中键入完整的路径名执行模块源文件一样。
使用脚本文件时,经常会运行脚本然后进入交互模式。这也可以通过在脚本之前加上 -i 参数来实
现。
8