图书简介:
第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
展开
前 言
已有30多年历史的Python现在已经成为一门热门语言,Python可以用于开发网站程序、移动应用程序、游戏程序、数据处理和分析程序、机器学习程序,并可用于实现自动化办公处理,吸引了大量的学习者。
Python具有程序设计语言的共性,同时又有自己的特点。Python的语法中有一些让人困惑的存在。例如,通过缩进来区分语句块;通过名称绑定来关联变量名和数据对象,名称没有类型限制,可以动态绑定任何类型的对象;“=”“+=”等都不是赋值运算符而是分隔符,直到Python 3.8才有真正的赋值运算符“:=”;尽可能不使用循环方式而是使用函数式编程方式自动遍历可迭代对象;类中的函数不能重载;由于Python的名称没有类型约束,强类型语言中的面向接口编程无法践行……如果不了解Python的特点而只看到程序设计语言的共性,就很难写出Python风格的代码,也就无法发挥Python的优势。
Python是一门多范式的语言,支持交互式命令、过程式编程、面向对象编程、函数式编程、元编程、同步/异步编程等。在适当的场景使用适当的范式,有助于构建清晰、简洁、使用方便、易于维护的程序代码。现在在数据分析和机器学习的程序设计中大量使用函数式编程,极大地简化了代码,使得程序清晰明了。由于云计算等分布式计算机体系结构的广泛使用,异步程序起到越来越举足轻重的作用。也就是说,如果可以通过一门语言的学习就能了解众多的编程范式,那么Python一定是一个不错的选择。
在计算机科学的发展过程中,一系列解决各类问题的方法逐渐形成,这些方法可以应用于其他领域。在学习编程的过程中,我们应该学习程序背后的计算机科学的独特思维方式,也就是所谓的计算思维。尽管计算思维并不依赖于计算机,但是如果需要用程序设计语言解决问题,当然要知道如何将解决问题的思路变成计算机语言、如何评价程序的性能、什么是面向对象设计的最佳实践、函数式编程解决问题的独特方法、如何通过异步调度程序提高性能等,这些知识不囿于某一门编程语言,但在学习编程时需要反复体会和实践。
编程是高度实践性的工作,“Linux操作系统之父”Linus Torvalds说:Talk is cheap,show me the code。本书努力通过实例展示编程背后的思维,同时覆盖尽可能多的语法点。但是一本编程的教材不应该是程序语言的手册,语法的细节还是应该通过编程语言的文档获得。
有人说Python简单易学,也有人说Python内容庞杂、具有无尽的模块,学不到尽头。因为不同的视角就是不同的世界,和任何其他语言一样,一方面Python简单易学是因为有人承担了复杂性、封装了复杂性,为其他人提供了简单的接口;另一方面,Python复杂的语法正是为了赋能封装复杂的编程,Python是简易和复杂二位一体的。
由于时间和精力有限,书中难免有错漏之处,欢迎读者批评指正。
展开