索引 / 001 ZH-CN
Python编程思维:如何像计算机科学家一样思考 cover

计算机科学

计算机科学

Python编程思维:如何像计算机科学家一样思考

Allen B. Downey

英文原名: Think Python: How to Think Like a Computer Scientist

计算机科学和Python编程的清晰实用介绍,涵盖基础知识、数据结构、面向对象概念、算法和问题解决。

难度等级
入门
学术层次
本科
Python编程编程入门数据结构面向对象编程算法思维计算机科学

01 / 导读

导读

引用

Downey, A. B. (2024). Think Python: How to Think Like a Computer Scientist (3rd ed.). O'Reilly Media. 官方免费版本:https://allendowney.github.io/ThinkPython/

章节概要

全书19章,每章都是一个 Jupyter 笔记本,可以在浏览器中通过 Colab 运行。第1至18章以术语表和习题结尾,大多数章节还有一节“调试”,讨论该主题常见的错误。

第1章:编程是一种思维方式

本章把编程看作一种思维方式,它兼具数学、工程和科学的特点。内容包括算术运算符、表达式、值与类型、字符串,以及形式语言与自然语言的区别,并引入全书后续要用到的术语。

第2章:变量与语句

赋值、状态图、变量名、import 语句、表达式与语句的区别、print、参数和注释。

第3章:函数

函数的定义与调用、形参、用 for 和 range 写循环、局部变量、栈图和回溯信息。例子取自巨蟒剧团(Monty Python)的歌词,章末讨论为什么值得编写函数。

第4章:函数与接口

本章用海龟绘图模块画正方形、多边形和圆,同时讲解封装、泛化、重构、开发计划和文档字符串,主题是设计彼此配合的函数接口。

第5章:条件与递归

整除与取模、布尔表达式、if、else 以及链式和嵌套条件,然后是递归、递归函数的栈图、无限递归和键盘输入。

第6章:返回值

有返回值的函数与返回 None 的函数、渐进式开发、布尔函数、带返回值的递归、对递归的“信念之跃”、斐波那契数列和类型检查。

第7章:迭代与搜索

遍历字符串和文件中的单词、更新变量、计数、in 运算符与线性搜索,全章围绕“有多少英语单词含字母 e”这一问题展开。本章还引入 doctest,习题中有 Spelling Bee 字谜。

第8章:字符串与正则表达式

字符串作为序列、切片、不可变性、比较与字符串方法,随后是写文件、查找与替换、正则表达式和字符串替换。习题使用文字游戏 Wordle。

第9–11章:列表;字典;元组

三种核心数据结构。第9章讲列表的运算、方法、排序、别名和列表参数;第10章把字典看作映射,讲计数器、遍历、累积列表和备忘录;第11章讲元组的不可变性、元组赋值、作为返回值的元组、参数打包、zip、排序和字典的反转。习题中贯穿回文和变位词等文字谜题。

第12章:文本分析与生成

先统计一部小说中的不同单词和词频,再讲二元组、马尔可夫分析和生成新文本。本章指出,这些算法与大语言模型的某些部分相似。

第13章:文件与数据库

文件名与路径、f-string、用 YAML 和 shelve 存储数据、检查等价文件以及遍历目录。最后的习题是在目录树中查找重复的照片。

第14–16章:类与函数;类与方法;类与对象

分三步介绍面向对象编程。第14章定义 Time 类,讲属性、纯函数、原型与补丁以及先设计后开发;第15章把函数改写为方法,并加入静态方法、str、init 和运算符重载;第16章用 Point、Line 和 Rectangle 类讲解等价与同一、深拷贝和多态。

第17章:继承

以扑克牌和牌组为贯穿示例,再讲父类与子类和特化,重点是牌的表示、比较和排序。

第18章:Python 补充内容

前面各章略去的特性:集合、Counter、defaultdict、条件表达式、列表推导式、any 与 all、具名元组和关键字参数打包。其“调试”一节在 doctest 之外又介绍 unittest。

第19章:结语

继续学习的建议:作者在数据科学和建模方面的其他著作、虚拟助手和其他开发环境等工具、Python 用户组,以及再学一门语言,并推荐函数式语言。

核心概念

第1–6章:基础、函数与递归

  • 值、类型和表达式:谈论程序所用的词汇,最先引入,以便读懂错误信息和文档。
  • 栈图:函数调用帧的图示,用来跟踪局部变量和递归调用。
  • 渐进式开发:以小步、可测试的方式构建函数,第6章再次运用。

第7–13章:字符串、集合与文件

  • 线性搜索:在序列中逐个查找元素,即第7章的模式。
  • 别名与可变性:多个名字指向同一个列表对象,以及元组和字符串为何不能原地修改。
  • 字典作为映射:按键直接查找,用于计数、备忘录和马尔可夫分析。
  • 持久化:通过文件、YAML 和 shelve 使数据在程序运行结束后仍然保留。

第14–18章:对象与 Python 补充内容

  • 程序员自定义类型:把数据和操作捆绑在一起的类。
  • 纯函数与方法:同一个操作先写成函数,再移入类中。
  • 继承与多态:通过子类复用类,以及可处理不同类对象的代码。
  • 测试:前面章节用 doctest,第18章加入 unittest。

评析

优点

  • 有意缩小的语言子集。 前言说明,本书只讲 Python 中用最少概念换取最大能力的部分,第18章则集中收录被省略的便利特性。
  • 有意识地教授术语。 术语在首次出现时即给出定义,并在每章末尾的术语表中复习;前言解释说,初学者要学的第二件事就是谈论程序所用的语言。
  • 内置调试与测试。 几乎每章都有“调试”一节,第三版还加入了 doctest 和 unittest,前言把这列为本版的改动之一。
  • 练习兼顾操作与反思。 每章的习题都以“Ask a virtual assistant”一项开头,示范如何核对助手的回答;后面的习题是文字谜题、文本生成、重复文件搜索和纸牌游戏,而不是抽象的操练。
  • 免费且可直接运行。 文本采用知识共享许可,笔记本无需安装任何软件即可在浏览器中运行。

局限

  • 范围有意收窄。 作者说明本书并不涵盖整个语言;书中没有系统的算法分析、对标准库的广泛介绍,也没有大型项目。
  • 依赖笔记本环境和虚拟助手。 本版围绕 Jupyter 和虚拟助手编写,偏好纯文本编辑器加终端的读者需要自行调整说明。
  • 对有经验的程序员起步偏慢。 前言提醒,已有大量 Python 经验的读者可能觉得前几章太慢。
  • 面向对象编程分阶段引入。 第一个面向对象章节有意展示不地道的写法,到第15章给出常用形式之前,读者可能觉得有些迂回。

在课程中的定位

在入门编程课程书单中,本书是一门精练的 Python 入门课,对术语、调试和解决问题给予同等重视。最接近的替代品是 Python Crash Course:它更快进入较大的项目,包括游戏、数据可视化和网络应用,而 Think Python 则停留在小程序,以及这些程序背后的术语与习惯上。How to Design Programs 和 Structure and Interpretation of Computer Programs 沿着另一种传统教编程,采用设计步骤和 Scheme 系语言,适合想获得比某一语言专书更深概念基础的读者。

Guttag 的 Introduction to Computation and Programming Using Python 覆盖面更广,包括计算建模和数据分析,是读完 Think Python 之后自然的下一步。The C Programming Language 的作用不同:在第一门语言已经熟练之后,从简短而底层的角度看内存与类型。

如何使用本书

本书适合从未编过程序的人,也适合懂另一门语言而想学 Python 的人,不设先修要求。各章前后依赖,前言要求读者按顺序阅读,并在继续之前做完习题。

实用的安排是:先读第1至6章,这是基础(算术、函数、条件与递归);然后读第7至13章,即字符串、集合与文件,这是日常 Python 的核心。第14至17章的面向对象编程可作为第二阶段,主要写脚本的读者可以读完第14章后略读。第18章最好在前面各章让你想写出更简短的代码时再读,第19章是简短的后续建议清单。

在 Colab 中运行每一章,亲手输入示例而不是只看,并完成习题,包括“调试”各节。按书中的建议借助助手获取提示时,要测试它给出的代码,并与本章自己的做法对照。

版本与来源

本导读依据第三版(2024),即作者在知识共享许可下于 https://allendowney.github.io/ThinkPython/ 发布的免费在线版本。内容基于前言、第1至18章的完整目录与全部小节标题、各章引言,以及习题和结尾一章。