第1章 引言 1
1.1 计算机科学的两种基本思想:算法和信息处理 1
1.1.1 算法 1
1.1.2 信息处理 3
1.2 现代计算机系统的结构 3
1.2.1 计算机硬件 4
1.2.2 计算机软件 4
1.3 计算系统简史 6
1.3.1 在电子数字计算机之前 7
1.3.2 第一台电子数字计算机(1940~1950) 8
1.3.3 第一种编程语言(1950~1965) 9
1.3.4 集成电路、交互和分时(1965~1975) 10
1.3.5 个人计算和网络(1975~1990) 11
1.3.6 咨询、通信和电子商务(1990~2000) 12
1.3.7 移动应用和普适计算(2000~现今) 13
1.4 开始Python编程 14
1.4.1 在交互式shell中运行代码 14
1.4.2 输入、处理和输出 16
1.4.3 编辑、保存和运行脚本 18
1.4.4 幕后:Python是如何工作的 19
1.5 检测和纠正语法错误 19
1.6 拓展阅读 20
1.7 本章小结 20
1.8 复习题 21
1.9 编程项目 22
第2章 软件开发、数据类型和表达式 23
2.1 软件开发过程 23
2.2 案例研究:所得税计算器 25
2.3 字符串、赋值和注释 27
2.3.1 数据类型 27
2.3.2 字符串字面量 27
2.3.3 转义序列 28
2.3.4 字符串连接 29
2.3.5 变量和赋值语句 29
2.3.6 程序注释和文档字符串 30
2.4 数字数据类型和字符集 31
2.4.1 整数 31
2.4.2 浮点数 31
2.4.3 字符集 32
2.5 表达式 33
2.5.1 算术表达式 33
2.5.2 混合模式算术和类型转换 35
2.6 函数和模块的使用 36
2.6.1 调用函数:参数和返回值 36
2.6.2 math模块 37
2.6.3 main模块 38
2.6.4 程序格式和结构 39
2.6.5 使用终端命令提示符运行脚本 39
2.7 本章小结 41
2.8 复习题 41
2.9 编程项目 42
第3章 循环和选择语句 44
3.1 确定迭代:for循环 44
3.1.1 执行语句给定次数 44
3.1.2 计数控制循环 45
3.1.3 增量赋值 46
3.1.4 循环错误:大小差一错误 46
3.1.5 遍历数据序列的内容 47
3.1.6 指定range函数的步长 47
3.1.7 向下计数的循环 48
3.2 格式化输出文本 48
3.3 案例研究:投资报告 50
3.4 选择:if语句和if-else语句 53
3.4.1 布尔类型、比较和布尔表达式 53
3.4.2 if-else语句 54
3.4.3 单路选择语句 55
3.4.4 多路if语句 55
3.4.5 逻辑运算符和复合布尔表达式 56
3.4.6 短路计算 58
3.4.7 测试选择语句 58
3.5 条件迭代:while循环 59
3.5.1 while循环的结构和行为 59
3.5.2 使用while循环的计数控制 60
3.5.3 while True循环和break语句 61
3.5.4 随机数 62
3.5.5 循环逻辑、错误和测试 63
3.6 案例研究:近似平方根 64
3.7 本章小结 66
3.8 复习题 67
3.9 编程项目 68
第4章 字符串和文本文件 70
4.1 访问字符串中的字符和子字符串 70
4.1.1 字符串的结构 70
4.1.2 下标运算符 71
4.1.3 子字符串切片 72
4.1.4 使用in运算符测试子字符串 72
4.2 数据加密 73
4.3 字符串和数字系统 75
4.3.1 表示数字的位置系统 75
4.3.2 将二进制转换为十进制 76
4.3.3 将十进制转换为二进制 76
4.3.4 转换技巧 77
4.3.5 八进制和十六进制数字 78
4.4 字符串方法 78
4.5 文本文件 81
4.5.1 文本文件及其格式 81
4.5.2 将文本写入文件 82
4.5.3 将数字写入文件 82
4.5.4 从文件中读取文本 82
4.5.5 从文件中读取数字 83
4.5.6 访问和操作磁盘上的文件和目录 84
4.6 案例研究:文本分析 86
4.7 本章小结 89
4.8 复习题 90
4.9 编程项目 90
第5章 列表和字典 92
5.1 列表 92
5.1.1 列表字面量和基础运算符 93
5.1.2 替换列表中的元素 94
5.1.3 插入和删除列表中的元素 95
5.1.4 搜索列表 96
5.1.5 排序列表 97
5.1.6 修改器方法和None值 97
5.1.7 别名和副作用 97
5.1.8 相等性:对象标识相等和结构相等 98
5.1.9 示例:使用列表查找数字集的中位数 99
5.1.10 元组 100
5.2 定义简单函数 101
5.2.1 简单函数定义的语法 101
5.2.2 形参和实参 102
5.2.3 return语句 102
5.2.4 布尔函数 102
5.2.5 定义main函数 102
5.3 案例研究:生成句子 103
5.4 字典 106
5.4.1 字典字面量 106
5.4.2 插入键和修改值 106
5.4.3 访问值 107
5.4.4 删除键 107
5.4.5 遍历字典 107
5.4.6 示例:十六进制回顾 108
5.4.7 示例:查找列表中的众数 109
5.5 案例研究:非指导式心理治疗 110
5.6 本章小结 113
5.7 复习题 114
5.8 编程项目 114
第6章 使用函数设计程序 116
6.1 关于函数定义及其运行机制的快速回顾 116
6.1.1 函数作为抽象机制 117
6.1.2 函数消除冗余 117
6.1.3 函数隐藏复杂性 118
6.1.4 函数利用系统可变性支持通用方法 118
6.1.5 函数支持分工协作 118
6.2 利用自顶向下的设计解决问题 119
6.2.1 文本分析程序的设计 119
6.2.2 句子生成器程序的设计 120
6.2.3 医生程序的设计 121
6.3 使用递归函数设计程序 122
6.3.1 递归函数的定义 122
6.3.2 跟踪递归函数 123
6.3.3 使用递归定义来构造递归函数 124
6.3.4 句子结构中的递归应用 124
6.3.5 无限递归 125
6.3.6 递归的优缺点 125
6.4 案例研究:收集文件系统信息 127
6.5 管理程序的命名空间 131
6.5.1 模块变量、参数和临时变量 132
6.5.2 作用域 132
6.5.3 生存期 133
6.5.4 使用关键字定义默认值和可选参数 133
6.6 高阶函数 135
6.6.1 函数作为第一类数据对象 135
6.6.2 映射 136
6.6.3 过滤 137
6.6.4 化简 137
6.6.5 使用lambda表达式创建匿名函数 137
6.6.6 创建跳转表 138
6.7 本章小结 139
6.8 复习题 140
6.9 编程项目 141
第7章 简单图形和图像处理 143
7.1 简单图形 143
7.1.1 海龟绘图法概述 143
7.1.2 海龟绘图法的常用操作 144
7.1.3 建立turtle.cfg文件并在IDLE中运行 146
7.1.4 对象实例化和turtle模块 146
7.1.5 绘制二维图形 147
7.1.6 检查对象属性 148
7.1.7 操作海龟绘图窗口 149
7.1.8 随机漫步 149
7.1.9 颜色和RGB系统 150
7.1.10 示例:使用随机颜色填充放射状图案 151
7.2 案例研究:分形图形中的递归模式 152
7.3 图像处理 154
7.3.1 模拟信号和数字信号 155
7.3.2 采样和数字化图像 155
7.3.3 图像文件格式 155
7.3.4 图像处理操作 156
7.3.5 图像的属性 156
7.3.6 images模块 156
7.3.7 遍历网格的循环模式 158
7.3.8 关于元组的使用 159
7.3.9 将图像转换成黑白 160
7.3.10 将图像转换成灰度 160
7.3.11 复制图像 161
7.3.12 模糊图像 161
7.3.13 边缘检测 162
7.3.14 缩小图像尺寸 163
7.4 本章小结 165
7.5 复习题 166
7.6 编程项目 166
第8章 图形用户界面 170
8.1 基于终端的程序和基于GUI的程序 170
8.1.1 基于终端的版本 171
8.1.2 基于GUI的版本 171
8.1.3 事件驱动编程 172
8.2 编写简单的基于GUI的程序 173
8.2.1 简单的“Hello world!”程序 173
8.2.2 用于所有GUI程序的模板 174
8.2.3 定义类和方法的语法 174
8.2.4 子类化和继承的抽象机制 175
8.3 窗口和窗口组件 175
8.3.1 窗口及其属性 175
8.3.2 窗口布局 176
8.3.3 窗口组件的类型及其属性 177
8.3.4 显示图像 178
8.4 命令按钮和响应事件 180
8.5 使用输入字段进行输入和输出 181
8.5.1 文本字段 181
8.5.2 数值数据的整数和浮点数字段 182
8.5.3 使用弹出式消息框 184
8.6 定义和使用实例变量 185
8.7 案例研究:猜谜游戏回顾 186
8.8 其他有用的GUI资源 189
8.8.1 使用嵌套框架组织组件 189
8.8.2 多行文本域 190
8.8.3 文件对话框 192
8.8.4 使用提示框获取输入 194
8.8.5 复选按钮 195
8.8.6 单选按钮 196
8.8.7 键盘事件 197
8.8.8 颜色的使用 198
8.8.9 使用颜色选择器 199
8.9 本章小结 201
8.10 复习题 201
8.11 编程项目 202
第9章 使用类设计程序 204
9.1 深入理解对象和类 205
9.1.1 第一个示例:Student类 205
9.1.2 文档字符串 207
9.1.3 方法定义 207
9.1.4 init方法和实例变量 207
9.1.5 str方法 208
9.1.6 访问器和修改器 208
9.1.7 对象的生存期 208
9.1.8 定义简单类的经验法则 209
9.2 案例研究:掷骰子游戏 210
9.3 数据建模示例 215
9.3.1 有理数 215
9.3.2 有理数的算术运算和运算符重载 217
9.3.3 比较方法 217
9.3.4 判等和_eq_方法 218
9.3.5 存款账户和类变量 219
9.3.6 将账户存入银行 220
9.3.7 使用pickle实现对象持久化 222
9.3.8 载入对象和try-except语句 223
9.3.9 纸牌游戏 224
9.4 案例研究:ATM 226
9.5 构建新的数据结构:二维网格 230
9.5.1 Grid类的接口 231
9.5.2 Grid类的实现:数据的实例变量 232
9.5.3 Grid类的实现:下标和搜索 233
9.6 案例研究:使用块加密算法进行数据加密 233
9.7 使用继承和多态来组织类 236
9.7.1 继承层次和建模 236
9.7.2 示例1:受限的存款账户 237
9.7.3 示例2:21点游戏中的庄家和玩家 238
9.7.4 多态方法 242
9.7.5 面向对象编程的优缺点 242
9.8 本章小结 243
9.9 复习题 244
9.10 编程项目 245
第10章 多线程、网络和客户端/服务器编程 247
10.1 线程和进程 247
10.1.1 线程 248
10.1.2 睡眠线程 250
10.1.3 生产者、消费者和同步 251
10.2 读者和写者问题 256
10.2.1 使用SharedCell类 257
10.2.2 实现SharedCell类的接口 258
10.2.3 实现SharedCell类的帮助方法 259
10.2.4 使用Counter对象测试SharedCell类 260
10.2.5 定义线程安全的类 260
10.3 网络、客户端和服务器 262
10.3.1 IP地址 262
10.3.2 端口、服务器和客户端 263
10.3.3 套接字和日期/时间客户端脚本 263
10.3.4 日期/时间服务器脚本 264
10.3.5 双向聊天脚本 266
10.3.6 多个客户端的同时处理 267
10.4 案例研究:建立医生和病人之间的双向对话 269
10.5 本章小结 273
10.6 复习题 274
10.7 编程项目 274
第11章 查找、排序和复杂度分析 276
11.1 衡量算法效率 276
11.1.1 衡量算法的运行时间 276
11.1.2 指令计数 278
11.2 复杂度分析 280
11.2.1 复杂度的量级 280
11.2.2 大O符号 281
11.2.3 常数因子的作用 281
11.2.4 衡量算法占用的内存 282
11.3 查找算法 282
11.3.1 查找最小数 283
11.3.2 列表的顺序查找 283
11.3.3 最好情况、最坏情况和平均情况的算法性能 283
11.3.4 列表的二分查找 284
11.4 基本排序算法 286
11.4.1 选择排序 286
11.4.2 冒泡排序 287
11.4.3 插入排序 288
11.4.4 最好情况、最坏情况和平均情况的算法性能回顾 289
11.5 更快的排序算法 289
11.5.1 快速排序 290
11.5.2 归并排序 293
11.6 指数算法:斐波那契递归 296
11.7 将斐波那契递归从指数算法转换成线性算法 296
11.8 案例研究:算法分析器 297
11.9 本章小结 301
11.10 复习题 302
11.11 编程项目 302
附录A Python资源 304
附录B 安装images库和breezypythongui库 306
附录C 图像处理API 307
附录D 从Python到Java和C++ 308