第1章 Python简介 1
1.1 Python的由来 1
1.2 Python的特点 1
1.3 Python解释器 2
1.4 Python程序的集成开发环境 3
1.4.1 Anaconda安装 3
1.4.2 Anaconda Navigator 5
1.4.3 Spyder的使用 6
1.4.4 Jupyter Notebook的使用 7
1.5 在命令行中使用Conda 9
1.5.1 将安装包的源设置为国内的镜像站 9
1.5.2 更新Conda的版本 10
1.5.3 和环境相关的操作方法 10
1.5.4 用Conda管理包 12
1.5.5 进一步了解Conda 13
1.6 本章习题 13
第2章 如何学习编程 14
2.1 编程的困难来自哪里 14
2.2 某种语言是否优于另一种语言 16
2.3 计算思维在编程中起着重要的作用 18
2.4 如何描述计算机上运行的算法 20
2.5 本章习题 22
第3章 Python程序的构成 23
3.1 Python程序的构成要素 23
3.2 Python的标识符和名称绑定 27
3.2.1 标识符 27
3.2.2 变量类型和字面量 28
3.2.3 名称绑定 30
3.3 Python程序的运算符和表达式 31
3.3.1 赋值运算符和表达式 31
3.3.2 算术运算符和表达式 32
3.3.3 比较运算符和关系表达式 33
3.3.4 逻辑运算符和表达式 34
3.3.5 成员运算符和表达式 36
3.3.6 位运算符和表达式 37
3.3.7 对象标识运算符和表达式 38
3.4 运算符优先级 38
3.5 输出格式的控制 39
3.6 一些有用的方法 41
3.7 本章习题 41
第4章 程序流程的控制 43
4.1 程序流程的三种基本结构 43
4.2 选择语句 44
4.2.1 单分支 44
4.2.2 双分支 45
4.2.3 多分支 45
4.2.4 选择语句嵌套 46
4.2.5 复合结构的语句缩进 47
4.3 循环语句 48
4.3.1 如何编写循环程序 48
4.3.2 循环的中断 51
4.4 空语句 52
4.5 本章习题 52
第5章 函数 54
5.1 函数的定义和调用 54
5.2 函数的参数传递 56
5.2.1 通过内存变化了解参数传递 56
5.2.2 参数传递中的若干情形 59
5.3 递归函数 62
5.4 变量的作用范围 65
5.5 匿名函数 67
5.6 函数标注和变量标注 68
5.7 文档字符串 69
5.8 内置函数 70
5.9 本章习题 71
第6章 模块和包 73
6.1 模块和包的作用 73
6.2 导入和使用标准模块 73
6.2.1 Python如何找到标准模块文件 74
6.2.2 模块的加载 75
6.3 名称空间和名称作用域 76
6.4 自定义模块 78
6.5 包 79
6.6 本章习题 81
第7章 数据类型和操作 83
7.1 Python的数据类型 83
7.2 容器类型对象的创建 84
7.2.1 序列类型的创建 84
7.2.2 无序类型的创建 88
7.3 对序列类型对象的操作 89
7.3.1 序列类型对象元素的引用 89
7.3.2 序列类型对象的切片 90
7.3.3 适用序列的常见运算符 93
7.3.4 字符串的编码和解码 93
7.3.5 字符串和数值的转换 94
7.3.6 与序列类型对象相关的函数 95
7.3.7 序列类型对象的循环遍历 98
7.4 无序类型容器对象的操作 99
7.4.1 与无序类型容器相关的函数 99
7.4.2 无序类型对象的循环遍历 102
7.5 浅拷贝和深拷贝 102
7.6 可迭代和迭代器 104
7.6.1 什么是可迭代和迭代器 104
7.6.2 推导式 106
7.6.3 生成器表达式 107
7.6.4 生成器 108
7.7 拆包操作符 109
7.8 迭代对象使得代码更简洁 110
7.9 本章习题 110
第8章 函数式编程 113
8.1 函数式编程的含义 113
8.2 纯函数 114
8.2.1 纯函数的反例 114
8.2.2 纯函数的正例 114
8.3 高阶函数 115
8.4 闭包 116
8.4.1 闭包的含义 116
8.4.2 闭包的应用 117
8.4.3 闭包探究 118
8.5 尾递归 118
8.6 Python内置的高阶函数 120
8.7 本章习题 122
第9章 文件和文件系统操作 123
9.1 文件和文件系统 123
9.1.1 不同操作系统的一些差异 123
9.1.2 绝对路径和相对路径 124
9.2 文件操作 125
9.2.1 打开文件 125
9.2.2 关闭文件 127
9.2.3 文件操作的常用函数 128
9.2.4 文本文件访问 128
9.2.5 二进制文件访问 133
9.3 目录操作 139
9.4 本章习题 141
第10章 异常处理 142
10.1 程序错误 142
10.2 异常捕获 143
10.3 异常的层次关系 146
10.4 抛出异常和异常的调用栈追溯 147
10.4.1 抛出异常 147
10.4.2 异常的调用栈追溯 148
10.5 用户自定义异常类 149
10.6 本章习题 151
第11章 面向对象编程 152
11.1 面向对象的相关概念 152
11.2 类的定义示例 155
11.3 实例生成和成员访问的代码示例 157
11.4 类和对象在内存中的存在 158
11.5 类实例的生成 159
11.6 类实例的销毁 162
11.7 专用方法 163
11.8 属性和方法的可访问性 165
11.9 类方法和静态方法 167
11.10 其他常用装饰器描述符 171
11.11 运算符重载 172
11.12 继承 173
11.12.1 继承实现扩展和多态 173
11.12.2 多继承 175
11.13 抽象类 176
11.13.1 通过继承实现抽象类 176
11.13.2 通过注册实现抽象类 177
11.13.3 内置抽象基类 179
11.14 如何实现装饰器 179
11.14.1 实现用户自定义的装饰器 179
11.14.2 实现日志输出的装饰器 181
11.15 本章习题 184
第12章 元编程 186
12.1 什么是元类 186
12.1.1 type是内置函数还是内置类 186
12.1.2 元类和类的关系 187
12.2 用元类创建类 189
12.3 元编程示例 193
12.4 本章习题 195
第13章 面向对象设计的原则 197
13.1 面向对象设计的原则简介 197
13.2 设计原则的应用 198
13.2.1 起步 198
13.2.2 基于单一职责的第一次改进 199
13.2.3 如何做到扩充时不需要修改 200
13.2.4 什么是Liskov替换 202
13.2.5 为不同的用户提供刚好够用的接口 203
13.3 Tkinter的简单介绍 207
13.3.1 图形用户界面的基本元素 207
13.3.2 简单的窗口程序 207
13.3.3 用类重构代码 210
13.4 面向对象的设计原则实例 211
13.4.1 构建概念到实现的层次关系 212
13.4.2 构建自定义的Canvas类 214
13.4.3 用户界面 217
13.5 本章习题 217
第14章 正则表达式 218
14.1 什么是正则表达式 218
14.2 正则表达式的主要用途 218
14.2.1 在字符串中查找子串 219
14.2.2 在文本中查找所有字符串 220
14.2.3 分隔字符串 220
14.2.4 替换一部分字符串 221
14.3 把正则表达式转成模式对象 221
14.4 正则表达式的语法规则 221
14.4.1 元字符 221
14.4.2 转义字符 222
14.5 正则表达式实例 223
14.6 可选标记参数的设置 226
14.7 分组扩展 228
14.8 本章习题 230
第15章 调试和测试 231
15.1 调试和除错 231
15.2 测试 232
15.2.1 doctest单元测试模块的使用方法 233
15.2.2 unittest单元测试模块的使用方法 236
15.3 本章习题 243
第16章 异步程序 244
16.1 进程和线程 244
16.2 异步程序和同步程序 246
16.3 并行与并发 246
16.4 多线程 247
16.4.1 主线程 247
16.4.2 创建和运行线程 248
16.4.3 守护线程 250
16.4.4 线程池 254
16.4.5 使用锁同步 258
16.4.6 可重入锁 261
16.4.7 生产者和消费者 262
16.4.8 其他同步对象 267
16.5 多进程 267
16.5.1 创建和运行多进程 267
16.5.2 进程间数据共享 269
16.5.3 进程间通信 272
16.5.4 进程同步 275
16.5.5 进程池 276
16.6 异步I/O 278
16.6.1 异步程序的调度方式 278
16.6.2 协程 279
16.6.3 可等待对象 282
16.6.4 让事件循环调度多个协程 282
16.6.5 多协程实现有限状态机 284
16.6.6 多协程共享数据 287
16.6.7 异步HTTP 289
16.7 本章习题 292
展开