Python入门别只看懂:用21天手敲代码练出编程手感 1. 先把笨办法这三个字掰开揉碎学Python的人里最常见的幻觉就是我看懂了。视频播放到一半讲师敲出一段列表推导式你点点头觉得这个语法真优雅教程翻到装饰器那一章你读了两遍觉得逻辑通了。然后关掉页面打开编辑器让你写一个带参数的装饰器手指头悬在键盘上一个字都打不出来。这个瞬间是很多人放弃编程的分水岭也是最诚实的一次自我检测。我做了几年带新人的活见过太多这样的场景。真正把Python学下来的人路径往往土得掉渣找一个能跑的小例子一个字符一个字符敲进去跑通改坏再跑通换一个继续。没有花哨的学习路线图也没有什么三周精通的速成班就是手不停地敲。我把这条路叫做笨办法但实际跑下来你会发现笨办法才是最短的那条路因为别的路都通向一个叫看懂但不会写的死胡同。这篇东西写给三类人看一是刚装完Python、连缩进都在纠结的纯新手二是学了几个月、能看懂别人代码但自己一动手就卡壳的半成品三是有其他语言基础、想快速把Python用起来的老手。不管你在哪一档下面这套靠亲手敲代码推进的成长路径都能直接拿去用。它不依赖任何付费课程不需要你有多好的数学基础只需要你每天肯坐下来把手指放到键盘上把眼睛从屏幕上挪开。2. 手敲到底在训练什么为什么它比看更管用2.1 看会和写会之间隔着一条什么河看代码的时候大脑干的是识别的活这个符号我认识这个单词我知道什么意思整个句子的意思大概能猜出来。识别是一件低耗能的事就像你看别人骑自行车你能看出他往左倾斜是在转弯但你自己上车照样摔。写代码调用的是完全不同的一套能力你需要从零开始构造需要记住语法细节需要预判运行结果需要在不报错和报错之间做判断。这中间隔着的是肌肉记忆加上语法记忆再加上调试直觉这三样东西没有一样能靠看来获得。举个特别具体的例子。for i in range(5)这行看的时候你觉得太简单了。但真正手敲的时候新手会在这几个地方翻车忘了冒号range拼成range(5)之外的花样比如range(0,5,1)心里没底循环体缩进用了三个空格i和1混用导致后面报错看不懂。这些错误不是智力问题是熟练度问题。熟练度只能靠重复输入来建立就像学打字你不可能靠看别人打字学会盲打。所以每次有人问我我看了三遍教程还是不会写怎么办我的回答永远是同一句把教程关掉把例子重敲一遍敲到不看屏幕也能写出来。这句话听着很粗暴但它背后有非常明确的道理——编程的输入输出通道是不对称的。你接收信息可以很快但输出信息需要经过手、眼、脑三方协调这个协调过程必须靠实际动作来磨合。2.2 手敲训练真正的四个收获很多人以为手敲就是加深记忆这个理解太浅了。我把它拆成四层每一层对应一种能力的建立缺一层你都会在某个阶段卡住。第一层是语法肌肉记忆。Python的语法糖不少切片、解包、f-string、推导式这些写法看的时候很顺眼但你自己写的时候会犹豫这里到底该用方括号还是圆括号。手敲到一定量之后这类犹豫会消失你会形成条件反射看到取列表后半段手就自动打出lst[-3:]。第二层是报错免疫力。新手最怕红色报错看到一屏英文就慌。手敲的过程中你会制造大量报错敲错缩进、变量名打错、括号不配对报错见得多了你会开始读报错信息会知道最后一行才是关键会知道File xxx.py, line 12这个行号直接指给你位置。这种免疫力只有在真实的报错里泡出来看教程永远学不会。第三层是调试直觉。写多了你会发现很多bug不是语法问题是逻辑问题循环少跑了一次、条件写反了、变量在循环外被覆盖了。这类问题没有报错程序照跑结果就是不对。能快速定位这类问题的人都是被自己写坏的代码反复折磨过的。第四层是从需求到代码的翻译能力。这是最值钱的一层。你听到把文件夹里的图片按拍摄时间重命名这样一个需求脑子里要能自动拆成读目录、取文件属性、排序、生成新名字、改名、处理重名冲突。这个拆解能力没法教只能靠你自己动手做过十来个类似的小需求之后自然长出来。2.3 为什么这条路看起来慢其实快我得诚实地讲手敲的效率在头两周是低于看视频的。看一个小时的视频你能接触到二三十个知识点手敲一个小时你可能只搞明白三个。这个差距会让人焦虑很多人就是在这个阶段跑回去看视频了于是永远在入门—放弃—重新入门的循环里打转。但第三周开始情况会反转。看视频的那批人知识面很宽但一个完整功能都拼不出来手敲的这批人虽然只掌握了几十个基础点但能独立写出一个能跑的小脚本了。再往后前者每学一个新东西都要重新经历一遍看懂但不会用后者因为有了底层手感学新库新框架的速度会越来越快。这个拐点我见过很多次位置大概在累计敲满二十到三十小时的时候。提示不要拿我今天学了几个知识点来衡量进度用我今天独立写出了什么能跑的东西来衡量。前一个指标会让你骗自己后一个指标骗不了人。3. 动手之前的准备别在环境上栽跟头3.1 把环境配到能跑就行不要追求完美我见过太多人卡在第一步纠结装哪个版本、用哪个编辑器、要不要配虚拟环境、要不要上容器。折腾两天环境配得漂漂亮亮代码一行没写热情已经耗尽。这是我特别想拦住的一种浪费。我的建议是极简起步。装官方最新稳定版解释器一路下一步记得在安装界面勾上把Python加进环境变量那个选项这个勾不勾后面在命令行里敲python是不是能直接起来差别很大。编辑器随便选一个你看着顺眼的装完能高亮、能运行就够了不用一上来就研究各种插件和快捷键。验证环境是否可用打开终端敲两行python --version python -c print(hello)第一行能看到版本号第二行能打印出 hello环境就没问题了。如果第一行报不是内部或外部命令说明环境变量没配好重新跑一次安装程序选择修改把那个选项勾上。这个问题在初学者里出现频率极高先解决掉别带着它往下走。虚拟环境的事我的态度是前两周不用管。你现在写的都是单文件小脚本最多用一个标准库不存在依赖冲突。等到你要同时维护两个用不同版本第三方库的项目时再去学虚拟环境那时候你会有真实的痛感学起来反而快。先有需求再学工具这个顺序别弄反。3.2 抄代码的边界哪些该抄哪些打死都不能抄手敲不等于抄。这两者的区别在于你有没有经过大脑。抄是复制粘贴手敲是逐字输入并且理解每一行为什么这么写。但即便是手敲也有一个抄的边界问题这里我给出非常明确的分界。可以照抄的部分库的调用方式、标准写法的样板代码、配置文件的格式。比如import语句怎么写、if __name__ __main__:这个惯用法、读写文件的那套with open(...) as f:结构。这些东西是约定俗成的你自己发明一套没有意义直接照抄抄几次就记住了。不能抄的部分逻辑结构必须自己想。比如统计一段文本里出现频率最高的三个词这个需求你可以去查Counter怎么用但先切分、再计数、再排序取前几这个思路必须你自己在纸上或者脑子里过一遍。如果你连思路都抄那你敲的每一行都只是手指运动脑子是空的敲一百遍也没用。我自己的做法是拿到一个例子先不看代码只读需求描述和预期输出自己在纸上写伪代码或者直接写Python卡住了再看一眼原代码看完立刻关掉凭记忆写。这个过程很别扭效率也低但它是唯一能让别人的代码变成你的能力的通道。3.3 每天敲多少行才算数这个问题我被问过不下几十次。我的答案从来不是行数而是完成度。行数是个很糟糕的指标因为写十行复杂的递归和写一百行重复的赋值语句含金量完全不同。我给一个更靠谱的度量方式每天至少完成一个可独立运行的小目标。小目标可以小到什么程度把一段字符串按逗号切开并去掉两端空格这种级别都可以关键是它得是一个完整的、能跑出结果的、你自己从零写出来的东西。一天一个一周七个一个月三十个你手上就有三十个能跑的小脚本了。这个积累速度看着不快但三个月之后你会发现自己面对新需求时脑子里会自动蹦出这个我好像写过类似的。时间上我建议每天固定四十分钟到一个小时。低于三十分钟进入不了状态高于两小时容易疲劳导致后半段纯机械重复。固定时间点比固定时长更重要比如每天睡前半小时形成习惯之后坐到桌前手就会自动想敲东西。注意不要用今天太忙当借口跳过一次。跳过一天的代价不是少敲一天而是习惯链条断了一环重新接上需要消耗额外的意志力。真的没时间敲五行也算维持节奏比完成量更重要。4. 四层递进把手敲这件事做出层次感4.1 第一层逐字复现把眼睛从屏幕上挪开这是最基础的一层目标是建立语法肌肉记忆。做法很土找一段二十到五十行的、你能大致看懂的示例代码一个字符一个字符地敲进编辑器全程不复制粘贴也不看原代码的缩进。这里有个关键细节很多人做错了敲的时候不要盯着原代码看先读一遍把这一段的意思记住然后转过去敲。一次记不住五行就记两行。这个动作强迫你的大脑在理解和输出之间来回切换效果比对照着抄强好几倍。开头会很痛苦一段三十行的代码可能要花二十分钟但坚持一周之后你的短时记忆容量和语法熟练度会明显上一个台阶。敲完之后必须做的事不看原代码尝试运行看能不能跑通。跑不通就自己调调不出来再看原代码。这个自己调的过程极其宝贵它就是在训练第2.2节里说的报错免疫力和调试直觉。我推荐第一层用的材料是那种有明确输出的代码比如打印九九乘法表、判断一个数是不是素数、把列表里的重复元素去掉。这些都是几十行以内、逻辑闭环、结果肉眼可验的例子。别一上来就搞爬虫和数据分析那些代码里一半是库调用你练不到语言本身。4.2 第二层闭卷重写用回忆把理解逼出来第一层练的是输入第二层练的是提取。做法是昨天敲过的那个例子今天不看任何参考从空白文件开始重新写一遍。这一层会暴露大量你以为自己会了其实不会的东西。我自己的经历很典型第一天敲完一个字典合并统计的例子觉得清清楚楚第二天闭卷写卡在dict.get()的默认值参数上卡了五分钟才想起来是counts.get(word, 0) 1这个写法。这个卡壳的瞬间就是真正的学习发生的地方因为大脑在努力检索检索成功一次记忆强度就上一个台阶。闭卷重写不要求逐字一致变量名不同、循环写法不同都没关系只要逻辑正确、能跑出一样的结果就算过。这一点很重要很多人误以为要一字不差地复现结果把精力花在记忆无关细节上。你练的是解决问题的能力不是背课文。如果闭卷写不出来怎么办我的处理是给自己十分钟硬想想不出来就回去看一眼看完立刻关掉再凭记忆写。绝对不要看一眼写一行。那种做法会让你产生虚假的流畅感实际什么都没记住。4.3 第三层故意改坏在破坏中理解机制前两层是模仿第三层是理解。这一层的玩法是把已经跑通的代码故意改坏看会发生什么。具体怎么改我列几个我常用的破坏手法。把缩进改掉一格把改成把列表的[0]改成[10]把range(5)改成range(5, 0)把函数里的return删掉把全局变量和局部变量同名在for循环里修改正在遍历的列表。每改一处先猜会发生什么再运行验证。numbers [1, 2, 3, 4, 5] for n in numbers: if n % 2 0: numbers.remove(n) print(numbers)这段代码你把结果猜出来了再跑。很多人第一反应是[1, 3, 5]实际跑出来是[1, 3, 5]吗不一定因为边遍历边删除会让索引错位结果取决于具体实现细节。这个猜错了的瞬间比看十遍讲解都管用因为它让你真正记住了不要在遍历时修改容器这条规则而且你知道为什么。第三层还有一个变体改需求。原来的例子是统计词频取前三你改成取出现次数大于等于二的词原来是正序排序你改成倒序原来是处理英文字符串你改成处理中文。每改一次需求你就要重新思考一遍逻辑这个思考过程就是第2.2节说的需求翻译能力的训练。4.4 第四层从零组装把碎片拼成能用的东西前三层都还是在别人给的框架里活动第四层是真正的独立。这一层的做法是给自己一个真实的小需求从空白文件开始不问任何人不看任何完整示例自己查文档、自己试错、自己拼出来。什么算真实的小需求举几个我实际练过也推荐给别人的把一个文件夹里的图片按修改时间排序重命名成IMG_0001.jpg这种格式读一个文本文件统计每个词出现次数输出出现最多的十个写一个简单的记账脚本把每天的收支追加到文件里能按月份汇总把一堆形如2024-03-05的日期字符串统一改成2024年03月05日写一个命令行小工具输入两个日期算中间隔了多少天这些需求的共同特点是有明确输入输出、能用标准库解决、做完立刻能验证对不对、总代码量在三十到八十行之间。做完一个你就多一个能拿出手的东西而且每个都需要你自己查文档查文档的能力就在这个过程中练出来了。给一个具体例子文件重命名这个很多人第一次写会踩边遍历边改名的坑from pathlib import Path folder Path(./photos) files sorted(folder.glob(*.jpg)) for index, path in enumerate(files, start1): target path.with_name(fIMG_{index:04d}{path.suffix.lower()}) if target.exists(): print(f跳过目标已存在: {target.name}) continue path.rename(target) print(f{path.name} - {target.name})这里有几个必须自己踩过才知道的点glob返回的是生成器所以先用sorted()转成列表再遍历避免改名过程中目录内容变化导致行为异常改名之前要检查目标文件是否存在否则在某些系统上会直接覆盖{index:04d}是补零格式化保证文件名长度一致方便排序。这些东西文档里都有但你只有真的动手写过一次才会知道要去查。5. 一份可以直接照抄的二十一天训练表5.1 三个阶段的目标与内容安排我把前三周拆成三个阶段每个阶段七天每个阶段有一个明确的能力目标。照这个表走三周之后你至少能手写出几十个小脚本并且具备独立解决简单需求的能力。阶段天数核心目标每天内容产出第一阶段第1-7天语法手感敲基础语法示例变量、条件、循环、列表字典、字符串处理每天1个能跑的小脚本第二阶段第8-14天函数与文件敲函数定义、参数、返回值、文件读写、异常处理每天1个带函数的脚本能读能写文件第三阶段第15-21天独立完成自选真实小需求从零实现三个完整的实用小工具第一阶段的具体内容我列一下避免你面对基础语法四个字发呆变量赋值与类型转换、if/elif/else、for和while、列表的增删改查和切片、字典的键值操作、字符串的切分替换格式化、元组的解包。每一个都别只看找例子敲敲完闭卷重写。第二阶段的关键是函数。函数的四个概念必须靠手敲打通定义和调用、参数传值、返回值、作用域。特别是作用域你得亲手制造一个函数里改了外面变量但没生效的场景才会真正记住那个坑。文件读写部分with open(...) as f:这个写法敲够十遍就成条件反射了encodingutf-8这个参数不要漏中文环境里漏了就是一堆乱码。第三阶段就是前面说的第四层自己找需求做。我给个选题思路从你自己生活里的小麻烦出发。手机相册里截图太多想批量改名、下载的文件后缀乱七八糟想统一、想统计自己这个月在某个App上花了多少钱这些都是好题目因为它们是你自己真正想要的工具做出来你会用用了你会想改改了就是新一轮练习。5.2 每天一小时的固定流程模板光有内容安排不够还得有个固定的流程模板让你坐下来就知道先干什么后干什么减少今天练什么这种决策消耗。我用的模板是这样的前五分钟回顾。打开昨天写的代码快速扫一遍不修改只是让记忆热起来。这五分钟很关键它是把短期记忆往长期迁移的动作。接下来二十五分钟新内容手敲。按当天的计划敲新的例子逐字输入不复制。这二十五分钟是全神贯注的状态手机放远一点。然后二十分钟闭卷重写。把刚才敲的东西关掉从空白文件重写一遍。写不出来就硬想实在想不出来看一眼再关掉。最后十分钟破坏实验。把代码改坏两三处猜结果跑验证把这个过程中的发现记一两句话在笔记里。笔记不用长今天知道了边遍历边删列表会出问题这种就够。这个模板总时长一小时节奏有张有弛而且每天都有回顾—输入—提取—验证四个环节覆盖了学习的完整闭环。坚持三周你会发现自己坐下来进入状态的速度明显变快。5.3 怎么判断自己是不是真的在进步进步这件事很容易被自我感觉欺骗。今天看懂了一个比较复杂的概念会觉得进步很大但那个可能只是理解层面的兴奋。我建议用三个客观指标来自查第一个指标是报错处理速度。三个月前你看到一个TypeError要愣半天现在能立刻定位到是哪一行、什么类型不匹配这就是硬进步。第二个指标是闭卷重写的成功率。找一个你两周前敲过的例子现在从零重写能不能在十五分钟内跑通。能说明东西真的进脑子了不能说明当时只是抄了一遍。第三个指标是面对新需求的启动速度。给你一个新需求从不知道从哪下手到能写出第一行的时间这个时间越短说明你的拆解能力越强。这三个指标都比我今天学了几个小时靠谱得多。我见过有人每天泡在教程里六小时三个月后连一个读写文件的小工具都写不出来就是因为从来没用这三个指标照过镜子。6. 手敲路上最常见的坑与排查实录6.1 高频报错速查表新手手敲时遇到的报错高度集中我把出现频率最高的几类整理成表遇到的时候直接对照比一页页翻搜索引擎快得多。报错关键词典型原因排查动作IndentationError缩进用了空格和Tab混排或者少/多缩进编辑器打开显示空白字符统一改成四个空格SyntaxError: invalid syntax上一行少了冒号、括号没闭合、中文标点混入看报错行的上一行检查:)这些符号NameError变量名拼错或者用了还没赋值的变量对比变量名大小写检查赋值语句位置TypeError类型不匹配比如字符串加数字打印type(变量)看清楚实际类型IndexError索引越界长度是5的列表取了[5]打印len(列表)确认索引范围KeyError字典里没这个键用dict.get(k)或k in dict先判断AttributeError对象没这个方法比如对列表用.keys()打印对象类型回文档确认可用方法ModuleNotFoundError库名拼错或者第三方库没装先在终端pip install再检查import拼写UnboundLocalError函数里给全局变量赋值但没声明想清楚是不是真的需要改外部变量尽量用返回值ValueError类型对但值不对比如int(abc)转换前打印原值加上异常处理这张表覆盖了新手百分之八十的报错。我建议你把它打印出来贴在显示器边上前两周对着查查着查着你就不需要它了因为那些原因你已经犯过太多次条件反射就记住了。关于读报错还有一个非常实用的技巧永远从最后一行往上读。Python 的报错栈最后一行才是真正的原因和位置上面的行是调用链。新手习惯从第一行开始读读到一堆文件路径就懵了然后开始怀疑人生。改掉这个习惯能省下大量时间。6.2 卡住时的三步自查法比报错更折磨人的是没报错但结果不对。这种情况没有红色提示全靠你自己找。我用的三步自查法很朴素但极其有效。第一步在关键位置打印。别猜直接print()。循环里打印每轮的变量函数入口打印参数函数出口打印返回值。把中间状态摊在阳光下问题通常一眼就现形了。很多新手不愿意加打印觉得low其实老手 debug 的时候打印用得比谁都多。第二步把大问题切成能单独验证的小块。你的脚本跑出来结果不对别盯着整个流程看把每一步拆开单独测。读文件对不对先打印读到的内容。切分对不对先打印切分后的列表。逐段验证总能定位到出问题的那一小块。第三步用最小可复现的例子重写一遍。当你在一个两百行的脚本里找不到问题试着用十行代码复现那个可疑的现象。往往在精简的过程中问题自己就跳出来了因为无关代码被剥掉了。这个技巧我用了很多年至今仍是我最常用的一招。提示卡住超过四十分钟就别硬扛了起来走一圈或者去睡一觉。很多问题在放松状态下会突然想通这不是玄学是大脑在后台继续处理。但注意是想通后自己回来敲不是想不通去刷手机然后不回来了。6.3 心态和环境上的隐形消耗技术上的坑好填心态上的坑不好填。我见过几个特别典型的心态陷阱说一下。一个是比较焦虑。看到别人三个月就能做数据分析项目自己三周还在跟列表切片较劲就开始怀疑方法不对。这个比较毫无意义因为别人的三个月背后可能有每天四小时也可能只是跟着教程跑通了几个案例而没有独立写的能力。你唯一该比的对象是两周前的自己。一个是教程追新。Python 生态更新快新库新框架层出不穷很容易陷入这个也想学那个也想学的状态。手敲这条路的核心恰恰是反过来的先把语言本身用熟再挑一个方向深入。语言不熟的时候学框架你只是在背配置遇到问题完全不知道从哪查。还有一个是环境干扰。手机放在桌上、浏览器开着十几个标签、微信时不时弹一下这些都会让你的一小时练习变成十分钟专注加五十分钟碎片。我的做法是练习的这段时间把手机放到另一个房间浏览器只留一个查文档的标签。这个动作听起来极端但它对练习质量的影响比任何学习方法都大。7. 我自己在这条路上踩出来的几点体会手敲这条路我走了很久也带过不少人走。最深的体会是学的速度不由你看多少决定由你亲手敲坏多少决定。那些跑不通、报错、调半天才通的时刻才是真正长本事的地方。顺风顺水跑通的例子你第二天就忘了。另外一个体会是别把笨办法当成一个阶段性的过渡它其实是可以一直用到很后面的方法。我到现在学一个新库第一件事还是找官方文档里的最小示例抄下来跑通然后改参数、改逻辑、故意搞坏看边界在哪。这套动作跟刚学Python时候做的一模一样只是速度快了很多。所谓高手和新人做的是同一件事区别只在于一个循环跑完要五分钟一个要五十分钟。最后分享一个我常给自己的小规则每次学完一个东西必须留下一个能跑的产物。可以是一个十几行的脚本可以是一段能打印出正确结果的函数甚至可以是三行能验证某个猜想的代码。没有产物的一天就当没学。这条规则很苛刻但它保证了我不会掉进感觉学了但什么都不会的坑里也希望它能帮你把注意力从看了多少挪到做出来什么上。第22天该做什么把前三周写过的东西翻出来挑一个你最不满意的重写一遍这次加上异常处理和命令行参数。你会发现那些你以为早就掌握的东西在提高要求之后又冒出了一堆新的问题。这些新问题就是下一轮练习的起点。这条路的乐趣也正在于此。