第1章 基础 1
1.1 历史 2
1.2 表达式 3
1.2.1 运算数 3
1.2.2 运算符 3
1.2.3 表达式的风格 4
1.2.4 表达式的嵌套 5
1.2.5 数据类型 5
1.2.6 副作用 6
1.2.7 小结 6
1.3 运行程序 6
1.3.1 交互执行模式 7
1.3.2 查阅帮助文档 8
1.3.3 执行Python程序脚本 9
1.3.4 标识符和关键字 10
1.3.5 运行环境的错误提示 11
1.3.6 示例:欧几里得算法 12
1.3.7 小结 15
1.4 内建类型、赋值和引用 15
1.4.1 字面值 15
1.4.2 构造方法 17
1.4.3 容器类型 18
1.4.4 索引和切片 22
1.4.5 左值、赋值和引用 24
1.4.6 del操作 29
1.4.7 小结 30
1.5 流程控制结构 30
1.5.1 if分支语句 30
1.5.2 布尔运算 33
1.5.3 while循环 34
1.5.4 for循环 40
1.5.5 条件表达式 42
1.5.6 定义简单函数 43
1.5.7 小结 44
1.6 输入/输出 44
1.6.1 标准输入/输出(I/O)流 44
1.6.2 重定向标准I/O至文件 45
1.6.3 用管道行串接I/O 46
1.6.4 标准I/O流对象 47
1.6.5 命令行参数 48
1.6.6 环境变量 49
1.6.7 格式化字符串 50
1.6.8 小结 51
1.7 简单练习 51
1.7.1 示例:打印金字塔图形 52
1.7.2 示例:3X+1问题 53
1.7.3 示例:绘制正多边形 54
1.7.4 示例:绘制函数曲线 55
1.7.5 示例:蒙特卡洛方法 56
1.7.6 示例:埃特金迭代法求方程的根 59
1.7.7 小结 61
1.8 程序执行模型 61
1.8.1 手段限制 62
1.8.2 无状态程序 62
1.8.3 有状态程序 67
1.8.4 线性存储器 73
1.8.5 使用栈设计程序 76
1.8.6 使用队列设计程序 79
1.8.7 小结 84
1.9 算法的性能描述 85
1.10 异常处理 87
1.10.1 基本语法 88
1.10.2 提升程序的健壮性 91
1.10.3 完整的异常捕获机制 94
1.10.4 小结 96
1.11 程序调试 97
1.12 总结 98
第2章 函数 99
2.1 函数基础 100
2.1.1 函数的作用 100
2.1.2 定义和调用函数 101
2.1.3 提供机制而非策略 102
2.1.4 用函数消除重复代码 103
2.1.5 Lambda表达式 105
2.1.6 回调函数 106
2.1.7 闭包 107
2.1.8 传参方式 108
2.1.9 文档字符串 110
2.1.10 小结 111
2.2 模块和包 111
2.2.1 处理名字冲突 111
2.2.2 模块与import 112
2.2.3 在模块中包含测试代码 113
2.2.4 模块搜索路径 113
2.2.5 包 114
2.2.6 小结 115
2.3 作用域和栈帧 115
2.3.1 名字的查找 115
2.3.2 nonlocal和global关键字 118
2.3.3 函数的调用栈 118
2.3.4 对象的生命期 119
2.3.5 小结 121
2.4 递归 121
2.4.1 单重递归 121
2.4.2 多重递归 124
2.4.3 示例:科赫雪花 125
2.4.4 示例:二叉树的后序遍历 127
2.4.5 消除尾递归 129
2.4.6 用栈和状态机消除递归 131
2.4.7 重复递归带来的性能陷阱 135
2.4.8 用动态规划消除重复递归 136
2.4.9 示例:通配符匹配 139
2.4.10 小结 141
2.5 类和成员方法 141
2.5.1 面向对象的函数调用风格 142
2.5.2 类和实例 143
2.5.3 定义类 144
2.5.4 创建实例 145
2.5.5 方法定义 145
2.6 高阶函数 147
2.6.1 对函数进行运算 148
2.6.2 函数装饰器 149
2.6.3 map和filter函数 152
2.6.4 小结 155
2.7 迭代器和生成器模式 155
2.7.1 可迭代对象和迭代器 156
2.7.2 生成器函数 157
2.7.3 列表推导式和生成器表达式 158
2.7.4 小结 160
2.8 总结 160
第3章 数据结构 161
3.1 列表 162
3.1.1 数组和内存 162
3.1.2 列表对象的结构 165
3.1.3 列表元素的插入 168
3.1.4 列表的排序 170
3.1.5 有序列表的二分查找 171
3.1.6 列表的基本操作接口 172
3.1.7 小结 173
3.2 链表 174
3.2.1 单链表 175
3.2.2 实现迭代器模式 178
3.2.3 用单链表实现栈 179
3.2.4 双向循环链表 180
3.2.5 用双向链表实现队列 182
3.2.6 双向链表的查找、插入和删除 183
3.2.7 小结 184
3.3 散列表 184
3.3.1 基本原理 185
3.3.2 应用示例 188
3.3.3 字典 189
3.3.4 小结 193
3.4 二叉树 194
3.4.1 概念和定义 194
3.4.2 表示和存储 196
3.4.3 遍历 198
3.4.4 二叉搜索树 200
3.4.5 二叉堆和优先队列 207
3.4.6 哈夫曼编码 209
3.4.7 小结 212
3.5 案例分析 212
3.5.1 deque链表块 212
3.5.2 OrderedDict有序字典 216
3.6 综合练习:寻路问题算法 218
3.6.1 图的表示 219
3.6.2 Dijkstra算法 221
3.6.3 A*算法 224
3.7 总结 231
第4章 面向对象 232
4.1 类 233
4.1.1 术语 233
4.1.2 成员方法 234
4.1.3 静态方法 236
4.1.4 类属性和类方法 237
4.1.5 私有成员 239
4.1.6 property装饰器 240
4.1.7 动态添加属性和slots 242
4.1.8 实例的生命周期 243
4.1.9 复制对象 244
4.1.10 小结 245
4.2 继承和多态 246
4.2.1 语法 246
4.2.2 如何设计类 249
4.2.3 多继承 251
4.2.4 鸭子类型和多态 252
4.2.5 小结 253
4.3 综合练习:GUI程序设计PyQt 253
4.3.1 安装PyQt 254
4.3.2 使用继承创建窗体 255
4.3.3 响应事件 256
4.3.4 小结 257
4.4 总结 257
参考文献 258