ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

单元〇 · 别把「学完语法」当入门条件

单元〇 · 别把「学完语法」当入门条件 专栏《Zero to Python》· 单元 00 · 别把「学完语法」当入门条件阅读时间约 25 分钟 · 本篇任务判断自己走哪条通道写下这个月要交的东西教材依据Python Crash Course3rd Edition 前言与第 1 章Automate the Boring Stuff with Python3e 前言Learn Python the Hard Way5th Edition 习题 0代码下载专栏《Zero to Python》示例代码一、先把问题摆出来先看一个下午。周日下午两点你拆开快递翻开那本评分很高的入门书。你按第 1 章的指示装好 Python在编辑器里敲下第一行print(Hello, World!)看着终端吐出这句话心里有点高兴。你接着往下读第 2 章变量与字符串第 3 章列表第 4 章操作列表第 5 章if第 6 章字典。每个例子你都敲了一遍都能跑出书上的结果。到晚上八点书签停在第 6 章。你合上书新建了一个文件——然后光标在那里闪你不知道该敲什么。不是忘了语法。for你会写if你会写字典的get()你也记得。你想不起来的是「该拿它解决什么事」。你脑子里全是书上的例子骰子、比萨、外星人飞船而你自己的生活里没有这些东西。于是你关掉文件心想「明天接着读第 7 章」。这个下午不是你的问题。它几乎会发生在每个用「按章节推进」的方式学编程的人身上。这套方式把入门定义成了一件读完了就算完成的事书按章节编号你就按章节推进每章都看懂了进度条就走到了头。可编程的验收标准从来不写在目录里——目录只告诉你内容在哪不告诉你什么样才算学会。两周之后你大概会撞上三个坑能看懂for但不知道什么时候该改用列表推导式知道异常要try但脚本还是会因为一个坏行整个崩掉记得open()的每个参数却从没处理过「读 500 个文件跑到一半断电」这种事。这三个坑的共同点是它们只在你要交付一个东西的时候才露出来读书读不到。第 2 个坑长什么样现在就能看见。下面是本机 CPython 3.14.4 上跑出来的原文一份四行的小账目第三行混进了一个文字脚本读到它就停住了。$ cat amounts.txt 12 7 abc 5 $ python3 sum_amounts.py Traceback (most recent call last): File /tmp/u00demo/sum_amounts.py, line 3, in module total total int(line.strip()) ~~~^^^^^^^^^^^^^^ ValueError: invalid literal for int() with base 10: abc请注意它停在哪12和7已经加进去了第 4 行那个5一次都没读到屏幕上没有任何结果。你把这段脚本交给同事他那边只要混进一行脏数据看到的就是「脚本没反应」。这个 bug 跟int()怎么用没有关系——int(abc)会报错这件事读书读到第 2 章就知道了。缺的是「一行坏了后面还读不读」这个决定而这个决定只在你要交出结果的时候才被逼出来。改法四行把坏行跳过去记下跳了几行继续往下跑。total0skipped0forlineinopen(amounts.txt,encodingutf-8):try:totaltotalint(line.strip())exceptValueError:skippedskipped1print(合计,total,跳过,skipped,行)跑出来是合计 24 跳过 1 行退出码 0。12、7、5三个数加起来正好是 24账目对得上而且这份输出能贴给别人看比一句「脚本报错了」有用得多。Al Sweigart 讲过一个他大学室友的经历把另一种可能讲得很直白。他室友在一家电子产品零售店打工店里要盯竞争对手的价格——安排三个人手工把对手的价格表抄下来、核对、重打每次更新要花两天。Sweigart 当时刚学 Python 不久写了几十行代码把那张表自动生成。三个人两天的活一个刚入门的人两小时做完了。他后来写Automate the Boring Stuff with Python的动机就藏在这个故事里学编程的人不需要先变成工程师他们需要的是一条从「我桌上有件麻烦事」到「这件事以后不用我做了」的路。那条路的起点不在语法第 1 章在你桌上那件麻烦事。这一篇要做的事只有一件把「入门」的标准从「读完哪几章」换成「交得出什么东西」然后据此决定你从哪儿开始。读完你会拿到两样东西——一张判断自己从哪个单元进场的表和一份这个月要交出的东西的清单。二、四条准则准则 1 · 入门以「能交付」为界Python Crash Course的作者 Eric Matthes 在前言里把目标写得很直「The goal of this book is to bring you up to speed with Python as quickly as possible so you can build programs that work—games, data visualizations, and web applications—while developing a foundation in programming that will serve you well for the rest of your life.」前言Who Is This Book For?注意这句里的顺序先「build programs that work」再「developing a foundation」。他没说「先把基础打牢」他说的是让你尽快能做出能跑的程序基础在这个过程中长出来。这句话不是随口写的。Matthes 在 2015 年一篇题为Unfinished Projects: One Last Programming Lesson from My Dad的博客里讲过它的来处Peak 53902015-12-16他父亲是 70、80 年代的软件工程师2011 年意外去世而一个月前他儿子刚出生。那一周他坐在父亲办公室里翻他的电脑看到一个做了好几年、始终觉得「还不够好」所以不肯发布的木工设计工具。他写道他唯一的记忆是那种「工作突然停住了」的感觉和一种知道那些项目永远不会见到用户的难过。回到阿拉斯加之后他给自己的项目定了一条新规矩不追求把代码写到无可挑剔把东西推到「有真实用户」那一步为止。这条规矩后来长成了整本书的结构——有学生问他「我做完了吗这样够好了吗」别的老师会说「别问我永远再努力一点」他每次回答的都是同一句这是个好问题。什么才算够好目录的来处同样具体。2013 年他在 PyCon 讲了一个关于把编程的开放理念带进教育的闪电演讲No Starch 创始人 Bill Pollock 在台下散场后说「哪天想写书欢迎提提案」。他当时不想写书。回到 Sitka 的教室他看到自己贴在墙上的那张手写清单——「What’s the least you need to know about programming in order to work on your own projects?」——盯着它想这就是我该写的书的目录。书里的三个项目游戏、数据可视化、Web 应用不是市场调研的产物是给教室里那些学生的一个答案。这条由五处独立材料互证出版社访谈 2024、Leanpub 播客逐字稿、Teaching Python 播客逐字稿、前述博客、PyDev of the Week 问答。同一位作者在同一个前言里还写了读者是谁「written for people of any age who have never programmed in Python or have never programmed at all」——面向任何年龄、没写过 Python 甚至完全没编过程的人。换句话说这本书并不假设你先把别的语言学完它假设你从零开始靠做东西把语言学会。这就是这个专栏的第一条准则这个月的验收标准不是「读完了」是「交出来了」。准则 2 · 语法是手段不是关卡教材里最容易让人停在原地的一句话是「基础要扎实」。基础确实要扎实但扎实的意思是「够用并且用对」不是「先全部学完」。Learn Python the Hard Way的作者 Zed Shaw 在习题 0 里讲环境时写了一段很实在的话「Nearly every programmer has their own specialized environment, but at first you’ll want something simple that can get you through this course. After the course you’ll know enough about programming to then waste the rest of your life trying every tool you can imagine.」习题 0General Instructions这句话的结构值得学先要一个够用的环境把课程走完工具挑挑拣拣是以后的事。语法也是同一个道理。match语句、async、元类、描述符——这些东西在你写第一个文件整理器的时候一个都用不上。等你写到需要它们的那一天再学那时的你已经知道「为什么需要」学的速度比现在快得多。所以这个专栏把语法压到六个单元单元 01–06只留「能开始做东西」的那部分剩下的留在后面五个月。准则 3 · 手打有用但理由不是「肌肉记忆」Zed Shaw 那本书的名字里有「the hard way」。他在习题 7 里直接写「Do not paste!」前言里也把「手打」写成一条 instruction——主张读者一个字符一个字符地把代码敲进去不复制粘贴。这个主张经常被简化成「手打能形成肌肉记忆」然后被当成玄学。它有用的真实理由要朴素得多手打会强迫你撞上错误。举个中文读者几乎一定会遇到的例子。你从电子书的代码块里照抄一行print你好世界# 括号和逗号都是中文全角运行它Python 3.14 会给你这个File fullwidth.py, line 1 print你好世界 ^ SyntaxError: invalid character (UFF08)这个报错里藏着三件事它告诉你是第 1 行它用^指着print后面那个位置它还把那个字符的 Unicode 码位UFF08直接写出来了。看懂这三件事你就不会再盯着屏幕想「这行明明跟书上一样啊」——以后遇到「明明一样却报错」你的第一反应会是「是不是有不可见的东西」。复制粘贴的时候你不会遇到这些IndentationError、少一个右括号、全角标点、文件编码不对——因为别人的代码是对的。手打的时候你会遇到而且得自己找到它在哪一行、为什么。这个过程里长出来的能力是「看到报错知道往哪看」不是手指记住了语法。今天更常见的来源是复制代码从 PDF、网页或聊天窗口里粘过来。除了全角标点还有两个字符专门这样坑人两段都是本机真跑的原文File /tmp/paste/curly.py, line 1 print(“你好”) ^ SyntaxError: invalid character “ (U201C) File /tmp/paste/nbsp.py, line 2 b 2 ^ SyntaxError: invalid non-printable character U00A0第一段里的引号是从 Word 或 PDF 带出来的弯引号第二段里b前面那个是不换行空格U00A0屏幕上看着和普通空格一样宽^指着第 1 列。两段报错的措辞不同一个说invalid character一个说invalid non-printable character但都吐出了那个字符的 Unicode 码位——这是你手上唯一能拿去搜的线索。先按码位搜一遍再把它删掉重敲一次。手打不会带上这些东西这就是它最省事的地方。这个专栏在这一点上取一个折中语法单元的示例手打项目单元的代码可以抄。项目单元的目标是学会用工具解决问题抄一遍别人的实现是正常做法语法单元的目标是让错误暴露出来那就得手打。准则 4 · 教材要分角色不要一本读到底上手最常见的错误是把一本入门书当成全部答案从头读到尾遇到讲不清的地方就卡住。Automate the Boring Stuff with Python的作者 Al Sweigart 把它写成了另一类书前半本给最小可用的语法后半本全是「要做某件事翻第几章」。它的第 3 版有 24 章后 16 章分别讲正则、文件、组织文件、命令行程序、网页抓取、Excel、Google Sheets、SQLite、PDF 与 Word、CSV/JSON/XML、时间与调度、邮件、图像、OCR、键鼠控制、语音。没人需要按顺序读完这 24 章——它本来就是一本遇到问题再翻的书。Sweigart 自己对这本书的定位也说得清楚它不是参考手册是给初学者的导轨。他还有一条容易被误读的做法全书用 CC 授权永久免费放在网上。常有人说他为此牺牲了销量他的说法反过来——不免费就没人愿意冒风险买一个无名作者的入门书所以免费是它卖得动的原因不是代价。这两本书的关系也不是竞品。Sweigart 在自己的推荐书目里「读完Automate之后读什么」这一格填的是他自己的Beyond the Basic Stuff with Python或Eric Matthes 的Python Crash Course。两本分工不同一本给你目的地一本给你今天就能用上的工具。所以这个专栏给教材分了四种角色你在动手前先认清手上这本属于哪一类角色意思是怎么用本专栏对应主线精读骨架与项目都从它来按章读读完一章就写那一章的代码Python Crash Course3e按需手册遇到具体问题才翻不逐页读只查要办的那件事Automate the Boring Stuff3e思维线讲怎么把问题拆开单元 14 用它其余时间不动Think Python3e权威文档有分歧时以它为准官方教程、PEP、库文档docs.python.org 等一条判断法读到某个说法和官方文档不一样以官方文档为准并把这件事记下来。这个月你会记下好几条它们汇成一份「教材纠正表」——那份表最后会比你抄的笔记值钱因为教材会过时而你知道它哪儿过时了。三、三条通道你从哪儿进同样是「没写过 Python」起点差得很远。先做一次自评再决定从哪个单元开始。通道 A · 有其他语言基础通道 B · 完全零基础通道 C · 写过 Python 脚本你的情况会 C / C / Java / MATLAB 之一或写过 Excel 公式、Shell 脚本没写过任何程序能跑起 Python 脚本但代码像「用 Python 语法写的 C」从哪个单元进00 → 01 → 02–06快速过→ 0900 → 01 → 02–06放慢→ 07 → 08 → 0900 → 01 → 0902–06 怎么读扫一遍遇到不熟的停一下每个单元按练习做完再走只做单元 06测试07–08零基础巩固跳过必做跳过预计周期6 周7 周5 周最容易踩的坑用别的语言的思路写 Python比如手写索引循环、用for i in range(len(x))卡在环境上就不动了以为自己会了跳过测试那一节如果你在 A 和 B 之间拿不准看你能不能读懂这段代码在干什么。deftotal(nums):returnsum(nforninnumsifn0)能一眼说出「把正数加起来」你走通道 A。要一行一行猜你走通道 B。这不是水平测试只是省时间用的。走错通道的代价很小——B 通道多出来的单元 07–08 是补强A 通道的人跳过去不会缺东西。四、这个月要交的东西说清了标准就该说交付物。这个月的产出是一条线的五个版本它们都叫datanote从最简单的开始长。版本它能做什么对应单元v0.1读一个目录规范化文件名按类型归档找出重复文件09v0.2有了命令行参数、日志和退出码别人也能用10v0.3能读 Excel、PDF、CSV、JSON 四种输入11v0.4出一张图和一份 Markdown 报告12v0.5四个脚本收成一个包pip install -e .装上就能用13为什么要做同一个东西做五遍而不是做五个不同的小练习因为「改自己上个月写的代码」是这一个月里最值钱的练习。你会在 v0.2 想给 v0.1 加个参数才发现当初那个函数把「读文件」和「打印结果」写在一起了你会在 v0.5 试着把四个脚本收成包才发现日志配置在四个文件里各写了一遍。这些尴尬时刻没法靠读书获得只能靠改自己的代码撞上。第一个月结束时你应该能拿出一个装得上的包不是四个散落的脚本一套全绿的测试不是「我手动试过了」一张自己能讲明白的图一份记录着「教材上这么写、现在要那么写」的纠正表。这四样东西有一个共同点它们都能给别人看。你可以把包发给同事让他装上把图贴进周报把纠正表留给下一个踩同一个坑的人。这就是这个月和「读完一本书」最实在的区别——你的产出不依赖任何人给你打分它自己就能证明自己有用。交付物还有一条只有交出去才会碰上的验收换一个工作目录它还跑不跑。下面这段同样是本机真跑的原文。一个读 CSV 的脚本在自己目录里跑得好好的$ python3 handover.py 读到 2 行 $ cd /tmp; python3 /tmp/u00b/handover.py Traceback (most recent call last): File /tmp/u00b/handover.py, line 2, in module with open(data/sample.csv, encodingutf-8) as f: ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileNotFoundError: [Errno 2] No such file or directory: data/sample.csv同一份文件、同一个解释器只换了当前目录就读不到。原因就写在报错那一行里data/sample.csv是相对当前工作目录找的你在自己机器上习惯从项目根目录敲命令它就一直对得上直到别人在别的地方敲。改法是让路径从脚本自己的位置算起importcsvfrompathlibimportPath basePath(__file__).resolve().parentwithopen(base/data/sample.csv,encodingutf-8)asf:rowslist(csv.reader(f))改完再换到/tmp跑照样是读到 2 行。这就是「有真实用户」最朴素的一层意思那个人不会站在你的目录里敲命令也不会替你补路径。我还想多说一句关于「学不会」这件事。你会卡住而且会卡不止一次。第一次卡住的时候大多数人会得出一个结论「我不适合学编程」。这个结论下得太早了。卡住通常只说明一件事你手上的材料没有为你此刻这个具体问题准备答案——它可能是本按章节推进的书也可能是一份你不知道怎么查的官方文档。这一篇剩下的部分就是教你在我这个专栏里卡住时该做什么。三条通道里选一条走然后照着这个月的清单交东西。至于「Python 高手」——那不在这个月的射程里。半年之后你会到什么程度我在第 15 单元会说清楚包括哪几件事半年后仍然不会。五、印证与出处这一篇的立场不靠个人口味来源如下你可以自己去核主张出处原话要点入门目标是「做出能跑的程序」基础在这个过程中长出来Python Crash Course3e 前言Who Is This Book For?「bring you up to speed with Python as quickly as possible so you can build programs that work… while developing a foundation」面向零基础不假设你先学过别的语言同上「who have never programmed in Python or have never programmed at all」「完成」是一门要练的手艺标准是「够好」而不是「无可挑剔」Matthes 博客Unfinished ProjectsPeak 53902015-12-16父亲电脑里那些「永远等不到用户的项目」三个项目的来处是教室墙上的手写清单五处互证出版社访谈 2024 / Leanpub #201 逐字稿 / Teaching Python #33 逐字稿 / Peak 5390 / PyDev of the Week「What’s the least you need to know about programming in order to work on your own projects?」一开始只要一个够用的环境工具挑拣是以后的事Learn Python the Hard Way5eGeneral Instructions习题 0「at first you’ll want something simple that can get you through this course」Python 版本不必纠结新于 3.10 即可同上「The version of Python you install mostly doesn’t matter so long as it’s newer than version 3.10」教材可以按「遇到问题再翻」来用Automate the Boring Stuff3e 的章节结构24 章里后 16 章各对应一类具体任务免费是分发策略不是道德姿态Sweigart 关于 CC 授权的公开说明三处互证不免费就没人愿意买一个无名作者的入门书两本入门书是分工而非竞品Sweigart 的推荐书目「读完Automate之后」这一格填的是Python Crash Course来源明细含逐字稿链接与可信度分级另有一份清单对上表每条主张标出材料来源与可信度。关于 Python 版本本专栏统一按3.13 及以上写实测环境是 CPython 3.14.4Ubuntu 26.04pytest 9.1.1sys.flags.utf8_mode 0——2026-09 的现行稳定版是 3.143.15 定于 2026-10-01 转正。你装 3.13 或 3.14 都能跑通全部示例某段代码只在更高版本可用时我会在那一行标出来。本篇后面出现的每一段报错输出都是在这个环境里跑出来的原文你可以按code/README.md里的三行命令复跑。有两件事顺带说清免得你被旧文章误导3.15 的 JIT 已在官方二进制里但默认关闭要PYTHON_JIT1才打开官方给的实测提升是 4–12%3.13、3.14 那两版初版 JIT 经常比解释器还慢这一点 Python Insider 官方博客自己承认过默认编码要分版本讲PEP 686 把 UTF-8 模式定为 3.15 的默认行为在 3.14 及以前它仍是关的。六、练习三级梯度按自己的通道选做。E00.1〔必做〕写下你的通道判断。用三句话回答我会哪门语言、能不能一眼读懂上面那段total()、我打算从哪个单元进。E00.2〔必做〕把这个月的交付物写下来。抄一遍上面那张表在每一行后面加一句「这一版我要用它解决的实际问题是什么」。如果某一行你想不出实际问题就写「暂时没有」——也是有用的信息说明这一版对你可能是纯练习。E00.3〔深〕读Python Crash Course前言找一处你不同意的说法。作者在前言里说三个项目游戏、数据可视化、Web 应用能覆盖大部分人的需求。如果你的需求不在这三个里写下你的需求是什么以及你打算用什么替代这条项目线。这个答案会在单元 09 用上。七、验收自测先自己想再往下看答案。这个专栏判定「入门完成」的标准是什么手打代码的用处是什么它不是什么教材和官方文档冲突时以谁为准答案交得出东西一个装得上的包、一套全绿的测试、一张能讲明白的图、一份教材纠正表。读完几章不算。用处是强迫你撞上错误并自己定位IndentationError、全角字符、编码问题这类练出来的是「看到报错知道往哪看」。它不是为了形成肌肉记忆也不该在项目单元强制执行——项目单元允许抄代码。以官方文档为准并把冲突记进教材纠正表。教材会过时知道它哪一处过时比记住它写了什么更有用。附录 · 术语表术语一句话解释首次出现脚本script一个直接运行、不供别人导入的.py文件§二 准则 3包package一组模块加一个声明文件能被pip install安装§四 交付物表解释器interpreter读你的.py文件并执行它的程序§三 通道表依赖dependency你的代码运行时要用的别人写的库§二 准则 4教材纠正表本专栏的固定产出三列记录「书里这么写 / 现在要这么写 / 依据」§二 准则 4本单元没有引入、因此不收的术语模块、虚拟环境、包索引PyPI、回溯、入口点 —— 它们分别在单元 01、02、13 首次出现届时由那些单元的术语表收录。说明这张表在 2026-09-21 裁过一轮——原先收了 10 条其中 5 条在本篇正文里从未出现删掉之后只剩正文用到的。→ 全书术语总表见术语总表
返回列表