Python程序设计与算法思维
作者 : [美] 斯图尔特·里杰斯(Stuart Reges) 马蒂·斯特普(Marty Stepp) 艾利森·奥伯恩(Allison Obourn) 著
译者 : 苏小红 袁永峰 叶麟 等译
丛书名 : 计算机科学丛书
出版日期 : 2020-06-02
ISBN : 978-7-111-65514-5
定价 : 139.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 628
开本 : 16
原书名 : Building Python Programs
原出版社: Pearson Education Inc.
属性分类: 教材
包含CD : 无CD
绝版 :
图书简介

本书作者在构建Python程序的过程中,将经过证明的、做过类测试的、回归基本的策略首次引入到Python程序设计教学中。本书以聚焦问题解决的分层渐进方法介绍了编程的基本原理,并在各个章节增加了新的语法和概念,以及展示了好的编程风格应该是什么样的,分阶段开发了一个复杂的程序。本书关注的是问题的解决,强调算法思维。

图书特色

注重程序分解和问题求解,强调算法思维,解决编写大型程序的难题

图书前言

Python编程语言近年来已经变得非常受欢迎。能够快速学习Python简单直观的语法让人印象深刻,也让许多用户创建了流行的程序库。Python由Guido van Rossum设计,Python社区称他为“仁慈的独裁者”(BDFL)。他说选择Python这个名字“略带随意性”,同时也因为他是“《Monty Python飞行马戏团》(一部英国喜剧片)的忠实粉丝”。谁不想学习以一个喜剧演员团体名称命名的编程语言呢?
本书旨在用于计算机科学的第一门课程。我们对亚利桑那大学的数百名本科生进行了课堂测试,其中大多数不是计算机科学专业的学生。本教材采用了与我们之前编写的《Java程序设计教程(第4版)》相同的风格。Java教材在我们的课堂测试中被证明是有效的,该测试覆盖自2007年以来在华盛顿大学学习的数千名学生。
计算机科学导论课程在许多大学有着悠久的历史,都是通过率很低的“杀手”课程。但正如道格拉斯·亚当斯在《银河系漫游指南》中所说的那样:“不要惊慌失措。”学生如果递进式学习,就可以掌握这门课程。
Python拥有很多特性,这使其成为用于第一门计算机科学课程的有吸引力的语言。它具有简单、简洁但功能强大的语法,使得学习轻松愉快,并且非常适用于编写许多常用的程序。学生可以只用一行代码来编写自己的第一个Python程序,而不像Java或C++这样的大多数语言需要编写若干行。Python包含内置的解释器和“读取-求值-输出”循环(REPL,交互式解释器),用于快速运行和测试代码,鼓励学生测试和探索语言。Python还提供了丰富的库,学生可以将它们用于图形、动画、数学、科学计算、游戏等。本书基于撰写时最新的语言版本Python 3,覆盖了该语言版本的现代特性和习惯用法。
本书基于“回归基础”的方法,侧重于过程式编程和程序分解。这也被称为“对象在后”方法,而不是某些学校采用的“对象先行”方法。根据我们多年的经验,许多科学家、工程师等都可以学习过程式编程。一旦我们建立了面向过程的坚实技术基础,就转向面向对象的编程。在本书的最后,学生将学习这两种编程风格。
以下是我们的方法和材料的主要特点:
专注于解决问题。许多教科书在介绍新构造时都会关注语言细节,我们则专注于解决问题。每个构造可以解决哪些新问题?新手可能遇到哪些陷阱?使用新构造的常见方法是什么?
强调算法思维。过程式方法允许我们强调算法问题的解决:将大问题分解为更小的问题,使用伪代码来细化算法,并解决用算法表示大型程序的困难。
彻底讨论主题。我们发现许多介绍性教材快速涵盖了新的语法和概念,然后就迅速进入下一个主题。我们觉得打开教科书的学生正是那种想要更彻底、更细致地解释和讨论棘手问题的学生。在本教材中,我们倾向于使用更长的解释,其中包含比其他教材更多的说明、图表和代码示例。
分层方法。编程涉及许多难以一次学到的概念。教新手编写代码就像试图建造一个纸牌屋:每张新牌都必须小心放置。如果太匆忙而试图同时放置太多纸牌,整个结构就会崩溃。我们逐层教授新概念,让学生逐步加深对概念的理解。
强调良好的编码风格。我们展示了使用正确和一致的编程风格,以及设计的代码。书中显示的所有完整程序都已经过全面注释和正确分解。在整本书中,我们讨论了习惯用法,好的和坏的编程风格,以及如何选择优雅和适当的方法来分解和解决问题。
精心挑选的语言子集。我们不是试图向学生展示每一种语言结构和特性,而是解释和使用我们认为最适合解决入门级问题的Python语言的核心子集。
案例研究。我们通过一个典型的案例研究结束大多数章节,向学生展示如何分阶段开发复杂程序以及如何在开发过程中对其进行测试。这种结构允许我们在丰富的上下文中演示每个新的编程结构,这是无法通过短代码示例来实现的。
层次和依赖关系
许多介绍性的计算机科学教材都是面向语言的,但本书前几章的方法是分层的。例如,Python有许多控制结构(包括循环和if/else语句),许多教材在一章中包含所有控制结构。虽然这对于已经知道如何编程的人来说可能有意义,但对于正在学习如何编程的新手而言,这可能带来压力。我们发现将这些控制结构分散到不同的章节来讲解更加有效,这样,学生可以一次学习一个结构,而不是一次性学习全部结构。
下表显示了前七章中的分层方法:
第1~7章的分层
章节 控制流 数据 技术 输入/输出
1 函数 字符串字面量 分解 print
2 确定循环(for循环) 表达式/变量,整数,实数 局部变量,全局常量,伪代码
3 参数,返回 使用对象 使用参数/返回值进行分解 控制台输入,图形
4 条件(if/else) 字符串 前置/后置条件,抛出异常
5 不确定循环(while 循环) 布尔逻辑 断言,健壮的程序
6 文件对象 基于行的处理,基于标记的处理 文件I/O
7 列表 遍历 文件作为列表

第1~5章是按顺序进行设计的,然后从第6章开始具有更大的学习灵活性。尽管第7章(列表)中的案例研究涉及从文件中读取,而第6章介绍了该主题,但仍旧可以跳过第6章。
下图显示了各章的依赖关系。强依赖关系绘制为实箭头。我们建议学习时不要覆盖强依赖顺序之外的章节。弱依赖关系绘制为虚箭头。弱依赖关系表示后一章简要提到了前一章中的主题,但是如果必要的话,仍然可以阅读和探索这一章而不必考虑前面的章节。

以下是各章之间弱依赖关系的更详细解释:
第7章中的一些示例,以及第8章中关于字典和集合的一些示例,会从文件中读取数据。文件输入/输出在第6章中介绍。但是,为了讨论列表或其他数据集合,不需要进行整体文件读取,因此如果需要,可以跳过第6章。
第11章中关于类和对象的一些示例提到了引用语义的概念,它在第7章中介绍。但是在第11章中重新解释了引用的概念,因此如果需要,可以在学习列表之前先学习类。
第9章中的一些递归函数会处理列表,并且一个递归函数会以递归方式反转文件的所有行。因此第9章在一定程度上依赖于第7章。但是,第9章中的几乎所有递归函数都可以只使用第1~5章的核心内容来编写和理解。
从图中可以看出,第7章可能是前五章之后最重要的章节,其内容被许多其他章节使用。常见的章节交换顺序是先学习第1~5章,然后学习第7章,再返回第6章学习关于文件的额外知识。
补充材料
所有自测题的答案都在本书配套网站http://www.buildingpythonprograms.com/中提供。
此外,配套网站还为学生提供了以下额外资源:
在线的补充内容。
所有案例研究的源代码和数据文件以及其他完整的程序示例。
第3章中使用的DrawingPanel类。
链接到基于Web的编程练习工具。
教师可以访问以下资源:
适用于讲课的PowerPoint幻灯片。
习题和编程项目的解决方案,以及许多项目的家庭作业规范文档。
考试题和解决方案的关键点。
要访问教师资源,请发送电子邮件至authors@buildingpythonprograms.com与我们联系。有关资源的其他问题,请联系作者或Pearson代表。
致谢
感谢Pearson的工作人员,他们帮助制作了这本书。Rose Kernan管理该项目,是我们在图书制作过程中的主要联系人。Rose做了非凡的工作,她在这个过程中始终勤奋、积极、乐于助人。Amanda Brands是内容制作人,她在此过程中提供了出色的支持。感谢Martha McMaster对本教材进行校对,感谢Shelly Gerger-Knechtl进行文案编辑和索引编制。感谢营销经理Yvonne Vannatta和编辑助理Meghan Jacoby。还要感谢Pearson的艺术和合成团队,他们对本书进行了排版。
感谢Pearson的主编Matt Goldstein。十多年前,Matt就认可了我们的工作,并与我们合作出版了《Java程序设计教程》第1版。Matt一直是一个坚定的支持者,我们总是很乐意与他合作。
最后但同样重要的是,我们要感谢亚利桑那大学的CSC 110学生,他们对本书的草稿进行了课堂测试,提供了有用的建议,并改正了草稿中的错误。

Stuart Reges,华盛顿大学
Marty Stepp,斯坦福大学
Allison Obourn,亚利桑那大学

上架指导

计算机/程序设计/Python

封底文字

本书基于“回归基础”的方法讲解Python编程基础知识及实践,侧重于过程式编程和程序分解,这也被称为“对象在后”方法。书中不仅详尽地解释了Python语言的新概念和语法细节,还注重问题求解,强调算法实践,并且新增了函数式编程内容,使初学者可以应对未来高并发实时多核处理的程序设计。
本书主要特点
专注于解决问题。每个构造可以解决哪些新问题?新手可能遇到哪些陷阱?使用新构造的常见方法是什么?
强调算法思维。将大问题分解为更小的问题,使用伪代码来细化算法,并解决用算法表示大型程序的困难。
彻底讨论主题。使用更长的解释,包含更多的说明、图表和代码示例。
分层方法。逐层教授新概念,让学生逐步加深对概念的理解。如将Python的控制结构分散到各章讲解,学习效果更好。
强调良好的编码风格。展示了具有正确且一致的编程风格的代码、习惯用法、好的和坏的风格选择,以及如何选择优雅和恰当的方法来分解及解决问题。
精心挑选语言子集。不是试图展示每一种语言结构和特性,而是解释和使用适合解决入门级问题的Python语言核心子集。
案例研究。在大多数章节的结尾提供典型的案例研究,展示如何分阶段开发复杂程序以及如何在开发过程中对程序进行测试。

译者序

纵观现代计算机从诞生之初发展到万物互联的当下,计算机编程语言在不同计算时代的交织变化中,或顺应时代大放异彩,或故步自封销声匿迹。比如,C语言之于Unix,HTML之于WWW,Java之于Android。计算如此多彩,引无数语言竞“挥毫”。正如历史画卷中的主角一样,计算时代造就了编程语言,编程语言代表了计算时代。而本书的Python语言恰恰是当下“数据为王,智能未来”时代的不二之选。来看看这些耳熟能详的名字,NumPy、Pandas、Matplotlib、SciPy、Scikit-Learn、TensorFlow、Keras,等等,Python的出现让你与顶尖技术前沿不再相隔十万八千里。这也就是每每学生产生为什么要学习Python语言的疑问时,我们最想让大家有所体会、有所领略的精妙所在。
本书的译者在教授“高级语言程序设计(Python)”课程的过程中深感一本好教材的重要性。一本好教材不仅关注知识的传递,更注重对学生编程思维、解决问题能力的培养。本书作为面向零基础初学者的教科书,详尽地解释了Python语言的每个新概念和每个语法细节,具有良好的、规范的代码示例,注重问题求解,强调算法实践。案例教学由简单到复杂递进展开,以便于读者清晰地理解和掌握整个编程和求解的思路。本书还根据ACM与IEEE的计算学科本科课程指南(CS2013)的最新要求,增加了函数式编程的内容,使初学者可以应对未来高并发实时多核处理的程序设计。本书对Python语言深入浅出、细致的讲解,以及课后大量的习题和编程实践,可以使初学者轻松掌握Python语言的精髓,并学以致用,解决科学研究、工程实践中的实际问题,以及切身体会程序设计之美。
我们要感谢对本书翻译工作提供帮助的老师们。本书由苏小红、袁永峰、叶麟、张羽、孙承杰五位老师主译,他们都是从事程序设计语言课程教学的一线老师,具体分工如下:第1、9、10章由叶麟负责,第2、3章由孙承杰负责,第4、11、12章由袁永峰负责,第5、8章由苏小红负责,第6、7章由张羽负责。机械工业出版社华章分社的编辑张梦玲在本书的整个翻译过程中提供了许多帮助,在此予以衷心感谢。
译文虽经多次修改和校对,但由于译者的水平有限,加之时间仓促,疏漏及错误在所难免,我们真诚地希望读者不吝赐教,感激之至。

译 者
于哈尔滨工业大学
2020年3月

图书目录

出版者的话
译者序
前言
第1章 Python编程简介 1
1.1 计算的基本概念 1
1.1.1 为何编程 1
1.1.2 硬件和软件 2
1.1.3 数字领域 3
1.1.4 编程的过程 4
1.1.5 为何选择Python 5
1.1.6 Python编程环境 6
1.2 一个完整的Python程序 7
1.2.1 打印输出 9
1.2.2 字符串文字(字符串) 9
1.2.3 转义序列 10
1.2.4 打印复杂图形 11
1.2.5 注释、空白和可读性 12
1.3 程序错误 14
1.3.1 语法错误 15
1.3.2 逻辑错误 17
1.4 程序分解 17
1.4.1 函数 18
1.4.2 控制流 21
1.4.3 标识符和关键字 23
1.4.4 调用其他函数的函数 24
1.4.5 运行时错误的例子 26
1.5 案例研究:绘图 27
1.5.1 结构化版本 27
1.5.2 没有冗余的最终版本 29
1.5.3 执行流分析 30
本章小结 31
自测题 32
习题 35
编程项目 39
第2章 数据和确定循环 40
2.1 基本数据概念 40
2.1.1 数据类型 40
2.1.2 表达式 41
2.1.3 字面量 43
2.1.4 算术运算符 44
2.1.5 运算优先级 46
2.1.6 混合和转换类型 48
2.2 变量 49
2.2.1 使用变量的程序 52
2.2.2 自增/自减运算符 56
2.2.3 打印多个值 57
2.3 for循环 59
2.3.1 使用循环变量 62
2.3.2 关于循环范围的细节 64
2.3.3 字符串乘法与打印部分行 67
2.3.4 嵌套for循环 70
2.4 管理复杂性 72
2.4.1 作用域 72
2.4.2 伪代码 74
2.4.3 常量 78
2.5 案例研究:沙漏图 80
2.5.1 问题分解和伪代码 81
2.5.2 初始结构化版本 83
2.5.3 增加一个常量 84
本章小结 86
自测题 86
习题 91
编程项目 94
第3章 参数与图形 98
3.1 参数 98
3.1.1 参数的机制 103
3.1.2 参数的限制 105
3.1.3 多个参数 107
3.1.4 参数与常量 110
3.1.5 可选参数 110
3.2 返回值 111
3.2.1 math模块 113
3.2.2 random模块 116
3.2.3 定义返回值的函数 119
3.2.4 返回多个值 123
3.3 交互式程序 124
3.4 图形 128
3.4.1 DrawingPanel简介 129
3.4.2 画线和形状 131
3.4.3 颜色 133
3.4.4 使用循环画图 137
3.4.5 文本与字体 139
3.4.6 图像 141
3.4.7 画图过程分解 141
3.5 案例研究:抛射轨迹 144
3.5.1 非结构化解决方案 146
3.5.2 结构化解决方案 148
3.5.3 图形版本 150
本章小结 153
自测题 153
习题 158
编程项目 164
第4章 条件执行 166
4.1 if/else语句 166
4.1.1 关系运算符 168
4.1.2 if/else语句嵌套 170
4.1.3 if/else语句分解 174
4.1.4 多个判别条件 176
4.2 累积算法 176
4.2.1 累积求和 176
4.2.2 求最小/最大值循环 178
4.2.3 使用if语句的累积求和 181
4.2.4 舍入误差 183
4.3 函数中的条件执行 185
4.3.1 前置条件和后置条件 185
4.3.2 抛出异常 186
4.3.3 回顾返回值 189
4.3.4 分支选择推理 191
4.4 字符串 193
4.4.1 字符串方法 194
4.4.2 按索引访问字符 196
4.4.3 字母和数值之间的转换 200
4.4.4 累积文本算法 202
4.5 案例研究:基础代谢率 203
4.5.1 单人非结构化BMR解决方案 204
4.5.2 双人非结构化BMR解决方案 207
4.5.3 双人结构化BMR解决方案 209
4.5.4 过程式设计启发式 212
本章小结 216
自测题 216
习题 221
编程项目 223
第5章 程序逻辑与不确定循环 224
5.1 while循环 224
5.1.1 寻找最小因数的循环 226
5.1.2 循环的启动 227
5.2 栅栏算法 230
5.2.1 带if语句的栅栏循环 232
5.2.2 哨兵循环 234
5.2.3 带最小/最大值的哨兵循环 236
5.3 布尔逻辑 238
5.3.1 逻辑运算符 239
5.3.2 布尔变量与标志 241
5.3.3 谓词函数 243
5.3.4 布尔Zen 245
5.3.5 短路求值 248
5.4 健壮的程序 251
5.4.1 try/except语句 252
5.4.2 处理用户错误 255
5.5 断言与程序逻辑 256
5.5.1 针对断言的推理 258
5.5.2 一个详细的断言示例 259
5.6 案例研究:数字猜谜游戏 262
5.6.1 不带提示的初始版本 263
5.6.2 带提示的随机化版本 264
5.6.3 健壮的最终版本 267
本章小结 270
自测题 270
习题 276
编程项目 279
第6章 文件处理 280
6.1 文件读取基础知识 280
6.1.1 数据和文件 280
6.1.2 在Python中读取文件 282
6.1.3 基于行的文件处理 285
6.1.4 文件结构与消耗式输入 286
6.1.5 提示输入文件 290
6.2 基于标记的处理 292
6.2.1 数值输入 294
6.2.2 处理非法输入 295
6.2.3 行与标记的混合使用 296
6.2.4 处理不同数量的标记 297
6.2.5 复杂的输入文件 301
6.3 高级文件处理 303
6.3.1 多行输入记录 303
6.3.2 文件输出 305
6.3.3 从网页中读取数据 308
6.4 案例研究:邮政编码查询 310
本章小结 316
自测题 316
习题 318
编程项目 321
第7章 列表 323
7.1 列表基础知识 323
7.1.1 创建列表 324
7.1.2 访问列表元素 326
7.1.3 遍历列表 330
7.1.4 完整列表程序 332
7.1.5 随机访问 335
7.1.6 列表方法 336
7.2 列表遍历算法 342
7.2.1 列表作为参数 342
7.2.2 列表的查找 343
7.2.3 替换与删除值 347
7.2.4 列表的逆序 348
7.2.5 列表中数据的移动 352
7.2.6 循环嵌套算法 355
7.2.7 列表推导 356
7.3 引用语义 357
7.3.1 值与引用 357
7.3.2 修改列表参数 360
7.3.3 空值 361
7.3.4 可变性 363
7.3.5 元组 366
7.4 多维列表 371
7.4.1 矩形列表 371
7.4.2 锯齿状列表 373
7.4.3 像素列表 377
7.5 案例研究:本福德定律 381
7.5.1 统计值 382
7.5.2 完成程序 385
本章小结 389
自测题 390
习题 395
编程项目 397
第8章 字典与集合 399
8.1 字典的基本概念 399
8.1.1 创建字典 401
8.1.2 字典操作 404
8.1.3 遍历字典 406
8.1.4 字典排序 408
8.2 字典的高级应用 409
8.2.1 字典的统计 409
8.2.2 嵌套的数据集合 414
8.2.3 字典推导 417
8.3 集合 419
8.3.1 集合的基本概念 419
8.3.2 集合操作 422
8.3.3 集合效率 425
8.3.4 集合示例:彩票 427
本章小结 429
自测题 429
习题 433
编程项目 434
第9章 递归 436
9.1 递归思维 436
9.1.1 一个非编程的示例 436
9.1.2 从迭代到递归 438
9.1.3 递归解决方案的结构 441
9.1.4 反转文件 442
9.1.5 递归调用堆栈 444
9.2 递归函数和数据 449
9.2.1 整数的幂 449
9.2.2 最大公约数 451
9.2.3 目录爬虫 455
9.3 递归图形 459
9.3.1 Cantor集 459
9.3.2 Sierpinski三角形 461
9.4 递归回溯 464
9.4.1 向北/向东旅行 464
9.4.2 八皇后问题 469
9.4.3 在找到解后停止 474
9.5 案例研究:前缀计算器 477
9.5.1 中缀、前缀和后缀表示法 478
9.5.2 计算前缀表达式 478
9.5.3 完整程序 481
本章小结 483
自测题 484
习题 487
编程项目 490
第10章 搜索和排序 492
10.1 搜索和排序库 492
10.1.1 二分查找 493
10.1.2 排序 498
10.1.3 洗牌 499
10.2 程序复杂度 500
10.2.1 实证分析 502
10.2.2 复杂度类 507
10.3 实现搜索和排序的算法 509
10.3.1 顺序搜索 509
10.3.2 二分查找 510
10.3.3 递归二分查找 512
10.3.4 选择排序 514
10.4 案例研究:实现归并排序 516
10.4.1 拆分和合并列表 517
10.4.2 递归归并排序 519
10.4.3 运行性能 522
10.4.4 混合方法 524
本章小结 525
自测题 526
习题 529
编程项目 531
第11章 类与对象 532
11.1 面向对象编程 532
11.1.1 类和对象 533
11.1.2 日期对象 534
11.2 对象状态和行为 535
11.2.1 数据属性 535
11.2.2 初始化器 537
11.2.3 方法 540
11.2.4 访问器和赋值器 543
11.2.5 打印对象状态 546
11.2.6 对象相等与排序 547
11.3 封装 549
11.3.1 封装的目的 550
11.3.2 私有属性和属性方法 550
11.3.3 类不变性 555
11.4 案例研究:股票类设计 558
11.4.1 面向对象设计启发式 559
11.4.2 Stock属性和方法头 560
11.4.3 Stock方法和属性方法实现 562
本章小结 564
自测题 565
习题 566
编程项目 569
第12章 函数式编程 570
12.1 函数式编程的概念 570
12.1.1 副作用 571
12.1.2 一等函数 572
12.1.3 高阶函数 573
12.1.4 lambda表达式 575
12.2 数据集合的函数操作 578
12.2.1 map函数 579
12.2.2 filter函数 580
12.2.3 reduce函数 581
12.2.4 列表推导 584
12.3 函数闭包 585
12.3.1 生成器函数 588
12.3.2 惰性求值 591
12.3.3 可迭代对象 592
12.3.4 生成器表达式 593
12.4 案例研究:完美数值 594
12.4.1 求和 595
12.4.2 第五个完美数值 598
12.4.3 利用并发 599
本章小结 602
自测题 602
习题 603
编程项目 604
附录A Python摘要 605

教学资源推荐
作者: Kathryn E.Sanders, Andries Van Dam
作者: [美]H. H. 塔恩(H.H.Tan),T. B. 多拉齐奥(T.B.D'Orazio)[香港]柯兆恒(S. H. Or),玛丽安 M. Y. 周(Marian M. Y. Choy) 著
作者: [印度]K.G.斯里尼瓦沙(K.G.Srinivasa) 阿尼尔·库马尔·穆帕拉(Anil Kumar Muppalla) 著
作者: 刘建舟 徐承志 陈荆亮 吴奕 编著 邵雄凯 主审
参考读物推荐
作者: 邹均 张海宁 唐屹 李磊  等著
作者: Nick Heinle, Bill Pena
作者: 康莉 李宽 陈国建 等编著
作者: [美]埃里克·S. 罗伯茨 (Eric S. Roberts) 著