简介:面向Python初学者的英文原版教材《Python Crash Course(第3版)》,由Eric Matthes撰写,适合零基础或想系统夯实编程能力的读者,以动手实践和项目制贯穿全书。资源为1个PDF文件,约7.97MB,共1个文件,可通过电子书方式阅读。目前已有1105人学习下载,是初学者高频选择的入门资料。内容覆盖Python基础语法、面向对象编程、模块与包、文件操作、调试与测试,并深入讲解Web开发(Flask/Django)、数据可视化(matplotlib/seaborn)、Pygame游戏开发、Pandas数据处理与自动化脚本等实用主题,还配有多个完整项目案例。读者通过本书可建立系统的Python知识框架,提升实际编码与排错能力,为后续数据分析、Web开发或自动化方向打下扎实基础。
1. 这本书不是拿来“读”的,是拿来“敲”的
你把《Python Crash Course 3rd Edition-2022-英文版.pdf》拖进阅读器之后,很可能和大多数人一样:从第 1 章开始读,读到函数和类就犯困,然后把它放进“以后再看”的文件夹。书名叫 Crash Course,但它的正确用法恰恰不是“读”,而是“敲”。全书分两半:前半本是 Python 基础语法,后半本是三个完整项目——外星人入侵游戏、数据可视化、带用户系统的 Web 应用。它不教你背语法,而是让你在项目里把语法用熟。这篇笔记适合两类人:一直想学 Python 但总倒在语法门口的人,以及需要带别人入门、想找一条“能做出东西”的教学路径的人。下面这些内容,都是围绕第三版英文原版展开的,挨个说清楚。
2. 3rd Edition 到底更新了什么:先识别你手里是哪一版
2.1 一眼看出 3rd 和 2nd 的差别:从编辑器到 Web 框架
先别急着敲代码,花两分钟确认你手里的文件确实是第三版。很多人在网上找到的 PDF 文件名写着 3rd Edition,实际内容是第二版,或者混着第二版的中文翻译版看。版本不统一,后面跟着书敲 Django 项目时会死得很惨,因为第二版和第三版的 Web 部分差异非常大。
第三版和上一版最明显的差别,在编辑器推荐上。第二版推荐的是 Sublime Text,第三版全面转向 VS Code,而且第 2 章给了 VS Code 的完整配置步骤,包括安装 Python 扩展、选择解释器、配置终端。如果你手里的 PDF 在第 2 章讲的是 Sublime Text 或者 Geany,那基本可以判断是旧版。再翻到第二部分项目,第三版的数据可视化项目用的是新版 matplotlib 和 plotly,Web 应用项目用的是 Django 4.x 和 Bootstrap 5,第二版则是 Django 2.x/3.x 配 Bootstrap 4。
还有一个判断点:书的前言或者封底会写明基于哪个 Python 版本。第三版基于 Python 3.11,第二版基于 Python 3.7。如果你发现书里还在推荐python3.7或者建议安装 Python 3.7,那这就是第二版,不是第三版。新版对类型提示、字典合并等语法都更干净,跟着旧版敲不影响学基础,但项目部分的代码到了新版环境会报各种兼容性错误。
| 对比项 | 第二版 | 第三版 |
|---|---|---|
| 推荐编辑器 | Sublime Text | VS Code |
| 基于 Python | 3.7 | 3.11 |
| 外星人入侵项目 | 结构较松散 | 参数集中到 settings,结构更清晰 |
| 数据可视化 | 旧版 matplotlib / plotly | 新版 API,图表默认风格更新 |
| Web 框架 | Django 2.x / 3.x | Django 4.x + Bootstrap 5 |
如果你手里的 PDF 前言部分明确写了 Third Edition,同时第二部分项目是 Django 4,那就是第三版无疑。我见过不少人拿第二版中文书配第三版英文原版一起看,结果 Django 的urls.py写法对不上,卡了好几天。后续避坑章节我会专门讲这个,这里先记住一件事:认准一个版本,别混用。
2.2 第三版的项目线:游戏、数据可视化、Web 应用怎么选
第三版后半部分是三个互不依赖的完整项目,你可以按兴趣和目的选,不用全做完。
第一个是外星人入侵(alien_invasion),用 pygame 写一个纵向射击小游戏。这个项目覆盖类、对象、事件循环、碰撞检测、状态管理,是三个项目里最“编程”的一个。它的特点是代码量不小,但每一步都是可见的反馈:你写完飞船移动代码,按方向键就能看到飞船动起来。这种即时反馈非常利于坚持。第二个项目是数据可视化,从随机漫步开始,到模拟掷骰子,再到读取 CSV 和 JSON 数据画图,用的是 matplotlib 和 plotly。这部分的反馈甚至比游戏更直观,几行代码就能画出一张图,适合对数据分析方向感兴趣、想尽快看到成果的人。第三个项目是用 Django 做一个名为“学习笔记”的 Web 应用,包含用户注册、登录、增删改查、样式美化,是三个项目里最接近真实产品开发的一个,也是工作量最大的。
我的建议是:如果你是第一次学 Python,时间有限,做“基础语法 + 数据可视化”这条线就够建立信心;如果你每天能挤出一小时,把“基础语法 + 外星人入侵 + 数据可视化”都做完,对面向对象和逻辑思维训练最完整;Web 应用那部分可以放到后面补,因为它涉及的概念层次比前两个多很多。三条线并不需要按书的顺序全做,它们共享的是第一部分的基础语法,项目之间没有依赖。选择标准只有一个:哪个项目的最终效果最能让你产生“我想把它跑起来”的冲动,就选哪个。
2.3 英文版的门槛没想象中高:前 200 页只需要懂这 30 个词
很多人不敢碰英文原版,是怕生词打断阅读节奏。实际上这本书的第一部分——基础语法——真正的术语量很小,而且这些词在代码里反复出现,看几次就条件反射了。真正会影响你读下去的,不是技术词汇,而是你试图读懂每一个英文句子。这本书的代码就是最好的解释,与其逐句读英文解释,不如先看代码,再回头扫一眼旁边的说明文字。
我帮你圈一下前 200 页最高频的词汇。你只需要知道它们的大致意思,剩下的靠代码上下文猜:variable(变量)、list(列表)、loop(循环)、function(函数)、argument(实参)、parameter(形参)、dictionary(字典)、key-value pair(键值对)、class(类)、instance(实例)、method(方法)、attribute(属性)、import(导入)、module(模块)、exception(异常)、file(文件)、test(测试)。这些词加起来不超过 30 个,但它们覆盖了第一部分 80% 的正文。
读英文版还有一个好处,是代码里的命名和说明文字完全一致。比如书里解释“一个字典里包含键值对”,代码里用的变量名就是alien_0 = {'color': 'green', 'points': 5},名词和代码对象一一对应,比中文翻译更不容易产生歧义。我的习惯是:遇到不认识的词,先在代码里找它对应的对象,如果代码逻辑能看懂,就不查字典;只有当代码和文字对不上时才去查。这个习惯能让你在读原版时保持流畅,而不是每三行就停下来查一个词。
3. 本地跑通最小闭环:环境、命令和第一个“能动的”程序
3.1 装对 Python 和编辑器:三条命令确认环境干净
在开始项目之前,先确认你的开发环境是干净的。这里说的“干净”指两件事:Python 版本正确、编辑器能用。第三版基于 Python 3.11,但并不意味着你必须精确到 3.11,3.9 以上跑前面的基础语法都没问题,只有到项目部分才需要留意 pygame 和 Django 对 Python 版本的要求。更重要的,是别让系统里同时存在多个互相干扰的 Python 版本。
打开终端(Windows 上是 PowerShell,macOS 和 Linux 上是自带终端),依次输入下面三条命令,确认你手头有什么:
python3 --version pip3 --version code --version如果提示找不到命令,Windows 用户可以试试py --version,这是 Python 官方安装包自带的启动器命令,能帮你找到已安装的版本。macOS 和 Linux 一般自带 Python 3,但版本可能偏旧,输出如果是 3.8 或更老,建议从官网重新安装一个新的稳定版,安装时注意勾选“Add Python to PATH”(Windows 上这一步尤其重要,不勾选的话后面python命令会找不到)。
代码编辑器和 Python 解释器是完全独立的两件事。编辑器是写字板,解释器是执行代码的引擎。我用 VS Code,装好 Python 扩展后,打开任意.py文件,右下角会显示当前使用的解释器版本。如果那里显示的不是你刚装的 Python,点一下版本号,在弹出的列表里选正确的那个。这一步看起来无关紧要,但很多人后面遇到的问题都出在这里:编辑器用的是系统自带的旧 Python,而你在终端里用的是新 Python,两边环境不一致,代码和行为就对不上。三条命令输出的版本号你都看一眼,记在心里,这是你排查问题时的基准值。
3.2 在项目目录里建虚拟环境:为什么我不建议直接 pip install
“虚拟环境”这个词看着吓人,其实就是一个独立的 Python 房间。你在房间里装的任何包,都不会污染全局环境,反过来也一样。这本书的项目部分明确要求使用虚拟环境,真实开发中也几乎必用,所以现在养成习惯最好。
mkdir crash_course cd crash_course python3 -m venv ll_env source ll_env/bin/activateWindows 用户把激活命令换成ll_env\Scripts\activate,macOS 和 Linux 用上面这条source ll_env/bin/activate。执行完激活之后,你的命令行提示符前面会出现(ll_env)前缀,这就说明你已经进入了虚拟环境。之后所有pip install和python xxx.py都要在这个状态下执行。
那我为什么不用全局环境?原因是毁灭性的:如果你在全局环境里装了一个 Django 2.x,又跑到另一个项目里装 Django 4.x,后装的会把先装的覆盖掉,两个项目总有一个会崩。虚拟环境让每个项目拥有完全独立的包集合,互不影响。在这个标题对应的书里,项目三会用到一个叫ll_env的环境,就是这里创建的。你可以随意改名,比如myenv,只要之后激活时用同一个名字就行。激活后安装本书需要的三个核心库:
pip install pygame pip install matplotlib pip install plotly pip install django装完之后,用pip list看一下当前环境里有哪些包,确认几个核心库都在。这套操作你会在每次开始一个新项目时重复一遍,熟练之后不到一分钟就能完成。
3.3 第一个程序别只打印 Hello World:用 pygame 开一个能动的窗口
基础语法部分,书里有大量 10 行以内的练习,你跟着敲就行。这里我给你一个更接近项目实战的起点:直接跑通外星人入侵里那个最小窗口。它只有 20 多行,却把变量、类、方法、循环、条件判断、模块导入这些基础概念全串起来了,比打印一百遍 Hello World 都有用。
# alien_window.py —— 外星人入侵项目的最小骨架 import sys import pygame class AlienInvasion: """管理游戏资源和行为的类""" def __init__(self): """初始化游戏,创建窗口""" pygame.init() self.screen = pygame.display.set_mode((1200, 800)) pygame.display.set_caption("Alien Invasion") self.bg_color = (230, 230, 230) def run_game(self): """开始游戏主循环""" while True: # 监听键盘和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 每次循环重新绘制背景色 self.screen.fill(self.bg_color) # 让最近绘制的窗口可见 pygame.display.flip() if __name__ == "__main__": ai = AlienInvasion() ai.run_game()保存为alien_window.py,确认终端里(ll_env)前缀还在,然后执行:
python alien_window.py窗口会弹出,背景是浅灰色,右上角关闭按钮可以直接退出。如果窗口闪退或直接报错,先检查两件事:虚拟环境有没有激活、解释器是不是在ll_env里。这段代码的逻辑可以拆成四步:先是pygame.init()初始化所有 pygame 模块,然后set_mode((1200, 800))创建 1200x800 像素的窗口,返回的self.screen是整个游戏画布;run_game()里的while True是游戏主循环,游戏里所有逻辑——移动、碰撞、绘制——都将在这里面执行;pygame.event.get()取出这一帧发生的所有事件,碰到关闭窗口事件就退出程序;最后fill填充背景色,flip把绘制结果推送到屏幕上。
两个参数你可以自己改着玩:窗口大小(1200, 800)改成(800, 600)试试,游戏区域会变小,绘制坐标也会跟着窗口尺寸走;背景色(230, 230, 230)改成(0, 0, 0),窗口会变黑。这两个改动虽然简单,但能帮你理解“参数是怎么影响程序行为的”——这是后面所有调参的基础。
4. 按“产出”刷项目:三选二的项目路线与参数调整
4.1 外星人入侵:核心循环拆成四个对象,改哪些参数能让它变好玩
外星人入侵是整个书代码量最大的项目,但它的结构其实非常清晰:一个游戏主类AlienInvasion管主循环,一个Settings类集中所有可调参数,Ship、Bullet、Alien分别管飞船、子弹、外星人的行为。你不需要一次写完,书里是按小节的,每节完成一个小功能。我的建议是每完成一个小节,就运行一次,看到对应的效果再继续。
下面这段是子弹更新位置的简化示意,你能看到 pygame 游戏里最常见的“移动 + 删除越界对象”模式:
# 更新子弹的位置并删除已消失的子弹 def update_bullets(self): """更新子弹位置""" for bullet in self.bullets.copy(): # 子弹向上移动,y 坐标减小 bullet.rect.y -= bullet.speed # 超出屏幕顶部后移除 if bullet.rect.bottom <= 0: self.bullets.remove(bullet)关键点有两个。第一,bullet.rect.y -= bullet.speed表示子弹向上移动,因为 pygame 坐标系里 y 轴向下增大;如果把减号改成加号,子弹会往下掉,飞船发射的子弹就会“落地”。第二,遍历列表删除元素时,直接用for bullet in self.bullets会在移除元素时跳过下一个元素,这是一个非常经典的坑。书里用self.bullets.copy()复制一份列表再遍历,原列表随便删,复制的那份只负责遍历,这样才不会漏掉子弹。你需要理解的不是这个具体功能,而是“遍历时不能改原列表,要遍历副本”这条通用规则。
项目做完之后,可玩性全靠Settings类里那十几个参数调节。下面是几个必调的参数和它们的影响:
| 参数名 | 默认值(示意) | 调整影响 |
|---|---|---|
| ship_speed | 1.5 | 飞船左右移动速度,调大响应更快 |
| bullet_speed | 1.0 | 子弹飞行速度,调太快会看不清弹道 |
| bullet_width | 3 | 子弹宽度,改成 300 就是“激光炮” |
| alien_speed | 1.0 | 外星人横向移动速度 |
| fleet_drop_speed | 10 | 外星人撞到边缘时向下移动的距离 |
| ship_limit | 3 | 飞船被击毁次数上限,改成 99 等于无敌 |
我的建议不是盲目调数值,而是先改一个,运行一次,观察变化,再改下一个。这个项目最好的玩法是给自己设挑战:比如把bullet_width改成 300 做出激光炮,或者把外星人下移速度调大逼自己优化飞船走位。这些调参练习的价值,远大于把代码原封不动敲完一遍。你能真正理解“参数”和“行为”之间的关系,这本书就算没白读。
4.2 数据可视化:随机漫步和骰子模拟是性价比最高的两节
数据可视化项目里有三块内容:随机漫步、模拟掷骰子、读取真实数据画图。如果时间紧,我建议你先做随机漫步,它是这个项目里最能体现“用代码生成数据再画图”的完整链路。下面是随机漫步类的核心逻辑:
# random_walk.py —— 随机漫步类,生成漫步路径数据 from random import choice class RandomWalk: """生成随机漫步数据的类""" def __init__(self, num_points=5000): """初始化漫步属性,默认生成 5000 个点""" self.num_points = num_points self.x_values = [0] self.y_values = [0] def fill_walk(self): """计算随机漫步包含的所有点""" while len(self.x_values) < self.num_points: # 决定前进方向以及沿这个方向前进的距离 x_direction = choice([1, -1]) x_distance = choice([0, 1, 2, 3, 4]) x_step = x_direction * x_distance y_direction = choice([1, -1]) y_distance = choice([0, 1, 2, 3, 4]) y_step = y_direction * y_distance # 原地踏步则跳过这一轮 if x_step == 0 and y_step == 0: continue # 新位置等于上一个位置加步长 x = self.x_values[-1] + x_step y = self.y_values[-1] + y_step self.x_values.append(x) self.y_values.append(y)这个类的设计很值得学:__init__里用num_points=5000作为默认参数,调用时不传就用 5000,传了就覆盖。choice([1, -1])负责从 1 和 -1 里随机选一个,正负号决定方向;choice([0, 1, 2, 3, 4])决定这一步走多远,为什么不直接从 1 开始而带个 0?因为如果不允许原地踏步,路径会显得太“直”,不够随机。x_step和y_step都为 0 说明这一步没挪地方,直接跳过。最后两个列表的末尾就是当前位置,新点永远接着上一个点生成。
你可以改两个参数看效果:把num_points从 5000 改成 50000,路径会变得更加密集和复杂,生成更慢但图形更饱满;把距离选择从[0, 1, 2, 3, 4]换成[0, 1],每一步都只挪一格,路径会非常细碎,像迷宫。改数字、跑一遍、看图变化,这就是实验的乐趣所在。数据可视化这一节,书还会带你看 CSV 数据文件,注意一个小坑:读取带表头的 CSV 时,先print(headers)看列名确认哪一列是日期、哪一列是数值,再写解析逻辑,否则很容易出现 KeyError。
4.3 Web 应用学习笔记:Django 4 的项目骨架和两个必看命令
Web 应用是三个项目里工程量最大的一个,但它会让你第一次体会到“写一个带数据库和用户系统的网站”是什么感觉。项目名叫“学习笔记”,你可以在上面注册账号、记录学习主题、给主题添加条目。它的核心概念是:用模型描述数据,用视图处理请求,用模板渲染页面,用 URL 把地址映射到视图。
创建项目和应用,两条命令就够:
python manage.py startproject learning_log . python manage.py startapp learning_logs注意第一条命令最后的点号,一个小数点,它的意思是“在当前目录创建项目”,不加这个点,Django 会多创建一层嵌套目录,后面所有命令的路径都会对不上。这也是新手最容易翻车的地方。startproject生成的是整个项目的骨架,startapp生成的是一个具体应用的骨架。之后每次修改models.py,你需要跑两条命令把模型变更同步到数据库:
python manage.py makemigrations learning_logs python manage.py migratemakemigrations会根据你的模型代码生成一个迁移文件,相当于“把改动记录下来”;migrate才真正把改动写入数据库。这两个命令是 Django 开发里最常用的两个,顺序不能反。第一次接触时,我建议你跑完migrate之后去看一眼项目目录里自动生成的db.sqlite3文件,那就是数据库本体,Django 用 SQLite 作为默认数据库,对新手最友好,不需要单独装数据库服务。
学到 Django 这部分,你可能会遇到一种情况:跟着书敲完一个功能,启动开发服务器python manage.py runserver,浏览器打开http://127.0.0.1:8000却报 404 或 500。别慌,优先看终端里输出的完整报错信息,Django 的报错页面是所有 Python Web 框架里最详细的,它会直接告诉你哪一个文件的哪一行出了什么类型的错误,大部分时候按着提示改就能解决。
5. 英文原版避坑指南:新手最容易卡住的 5 个细节
5.1 全角符号和手误:报错信息里的“invalid character”八成是输入法
现象:你照着书敲了几行代码,运行时报错SyntaxError: invalid character '‘' (U+2018),位置停在某个引号上。
原因:中文输入法还开着,把英文单引号'打成了中文弯引号‘或’。这个字符在 Python 眼里既不是字符串边界也不是运算符,直接导致语法错误。书是英文原版,所有代码标点都是英文半角符号,这是最容易出错的点之一。
解决:看到报错里出现U+2018、U+2019、U+201C、U+201D这类 Unicode 编码,立即确认是引号问题。把报错位置的引号、逗号、括号删掉,切换到英文输入法重新敲一遍。如果你用的是 VS Code,打开右下角能看到当前输入状态;更靠谱的办法是每次在编辑器里敲代码前,先随便打几个字符,确认打出来的是英文半角。我自己的习惯是写完一段代码就运行一次,这样即使出错也只需要排查最近几行。
5.2 pygame 装上了却不能用:Python 版本和包版本不匹配
现象:在虚拟环境里执行pip install pygame成功,但运行项目时报ModuleNotFoundError: No module named 'pygame',或者安装时直接提示找不到匹配版本。
原因:pygame 是编译型扩展包,需要和具体 Python 版本匹配。如果你用的 Python 版本太新或太老,pygame 没有针对这个版本提供预编译包,pip 尝试从源码编译就可能失败,或者装上了但导入失败。另外,如果你在系统全局环境装了 pygame,而未在虚拟环境里装,同样会报模块不存在。
解决:优先使用书对应的 Python 3.11 或者相邻的稳定版本(比如 3.10 和 3.11)。安装后不要急着写代码,先在终端里执行python -c "import pygame; print(pygame.version.ver)"验证能正常导入。这一步能帮你把“装包”和“导入”两个环节分开排查,避免后面混淆。记住:pip install成功不等于import成功,必须验证导入才算真正装好。
5.3 包明明装了还是 ModuleNotFoundError:先看虚拟环境有没有激活
现象:按上一章的命令创建了ll_env并安装依赖,然后新开一个终端窗口运行项目,提示找不到pygame、matplotlib、django其中一个或多个。
原因:新开的终端窗口没有激活虚拟环境,默认在用全局 Python 解释器执行命令。全局环境里没有这些包,当然找不到。这和上一节的报错信息一样,但原因完全不同。
解决:先看命令行提示符前面有没有(ll_env)前缀。没有就先执行source ll_env/bin/activate(Windows 是ll_env\Scripts\activate)再重新运行。如果你用的是 VS Code,打开终端之前,先用命令面板选择正确的 Python 解释器路径,指向ll_env里的那个 Python。有一个更粗暴但有效的排查手段:在终端里执行which python(Windows 是where python),看输出路径里是否包含ll_env,不包含就说明激活失败。
5.4 跟着书敲完但窗口一闪而过或黑屏:先查主循环,再查缩进
现象:运行章节里给的入口文件,程序没有报错,但窗口闪一下就没了;或者窗口一直显示背景色,按任何按键都没反应。
原因:窗口一闪而过,多半是忘了写主循环while True,程序执行完pygame.display.flip()就结束了,窗口立即关闭。黑屏没响应,则可能是主循环里的pygame.event.get()没有处理键盘事件,或者缩进不对,事件处理代码被放到了循环外面。
解决:先用“探针法”——在run_game()第一行加一句print("game running"),如果运行后终端里输出了这行字但窗口没反应,说明问题在主循环之后;如果连这行都没有输出,说明run_game()压根没被调用,检查文件最底部的if __name__ == "__main__":入口。缩进问题比较隐蔽,Python 里每一级嵌套都要用四个空格,不要混用 Tab。VS Code 默认会把 Tab 转成空格,但老文件可能不是这样,建议全选代码后执行“Format Document”统一格式。
5.5 二手资料混用:第二版中文版配第三版原版,Django 必打架
现象:你在学 Web 应用部分时,手里是第三版英文原版,遇到看不懂的地方去翻第二版中文翻译版,结果按照第二版的写法敲第三版的代码,运行时报错TypeError或者 URL 匹配失败。
原因:第二版 Django 项目的urls.py用的是url()函数,第三版用的是path();第二版还在用django.urls.include的旧写法处理多个应用。两版对不上,报错五花八门。这也是英文原版新手最常见的“内耗型”问题,不是书的问题,是版本混用的锅。
解决:全书只认一个版本,所有项目代码按第三版敲,碰到不懂的英文看注释和代码逻辑,而不是去翻第二版。如果你真的需要参考中文资料,只参考第一部分的基础语法——变量、列表、字典、函数、类——这部分两版差异很小。而 Django、pygame、数据可视化这三块,严格按第三版原版来。记住一个简单的判断标准:如果某个教程里出现url(r'^', ...)这样以^开头、逗号后不带<>尖括号的写法,它就不是第三版的语法,跳过它。
6. 把 600 页读薄的一个习惯:先做验收清单,再读代码
这本书读完和读完并做完是两种完全不同的状态。想从后者那里拿结果,最有效的习惯不是做笔记,而是“先看效果图,再列验收清单,最后带着清单读代码”。每个项目开头都会展示最终运行的截图:外星人入侵是一艘飞船在发射子弹,数据可视化是一张随机漫步路径图,Web 应用是一个可以登录的网站。你可以对着这些截图,给自己列一个功能验收清单,把项目拆成可以独立验证的小任务。
比如外星人入侵的验收清单大概是:窗口能打开并正确显示背景色 → 飞船能左右移动 → 按空格键能发射子弹 → 子弹到达屏幕顶部后消失 → 外星人出现并向下移动 → 飞船撞到外星人游戏结束 → 得分能显示在屏幕上。每一行都是一个可提交的里程碑。然后用 git 做小步提交,完成一小节就存一个版本:
git init git add -A git commit -m "ship can move left and right"这样你就有了一个可以随时回退的进度存档,比书里的任何“复习”都管用。感到乱的时候,打开git log看提交记录,你能直观地看到自己往前走了多少步,这种正向反馈比“我又读了 60 页”要真实得多。说实话,我当年读这本书时,最大的教训就是高估了自己的自制力,前面几章觉得简单就跳着看,到写类和对象时被绕晕,最后乖乖回来从第 8 章重敲一遍。这件事之后我养成了先列清单再动手的习惯,效率反而高了。希望这篇笔记能帮你把这本书真正“敲”完,而不是再放进“以后再看”的文件夹,希望帮到你。
本文还有配套的精品资源,点击获取