
我学Python的第三天正好卡在了一个特别有意思的位置上第一天的新鲜感已经过了py文件能print出“Hello World”的兴奋劲也消退了但距离能用Python干点正经事——比如处理个Excel表、爬点网页数据、写个小工具——又还隔着好远。打开编辑器面对着一片空白的代码框很多人就是在这个节点上开始怀疑“我是不是不适合学编程”的。如果你恰好也走在Python入门的路上正在经历这种“第三天迷茫”那这篇东西就是写给你看的。我会把第三天的学习内容、实操代码、踩坑记录以及我当时是怎么从“看得懂教程”跨到“自己能动手写”的完完整整梳理一遍。这里面没有玄学全是过来人的实践复盘。1. 第三天到底该学什么给学习路线定个“里程碑”在决定第三天学什么之前我先把前两天的进度盘了一下。这是我自己定的一个节奏不一定适合所有人但我觉得对上班族和零基础自学党来说这个节奏比较友好第一天主要是搞定Python安装和编辑器理解“代码是怎么跑起来的”第二天开始接触变量、赋值、字符串和基本的print输出算是第一次真正“写”代码到了第三天目标就不能再停留在“照着教程抄一遍然后运行成功”这个层面了。第三天的核心目标是建立起“程序逻辑”的概念。说白了就是让代码学会“做判断”和“重复干活”。这两件事是几乎一切程序的地基也是从“死板的代码”走向“有点智能的代码”的关键一步。我见过不少自学Python的朋友学了一个星期还在反复练习print各种字符串、拼接各种变量然后觉得自己进度慢、没天赋。别逗了那根本不是天赋问题是学习路线出了问题——你在同一个维度上重复太久了没有把能力向“逻辑控制”这个维度推进。所以说第三天安排的其实是两块硬骨头条件判断和循环。啃下它们你就能写出第一个真正有点“程序模样”的东西比如一个能根据输入做不同反馈的小程序一个能自动生成九九乘法表的小脚本。如果你跟我当时一样属于“光看不写会困”的类型那这天的内容绝对够你忙活大半天而且忙完以后会有一种“哦原来代码是这么控制家伙事的”的通透感。顺便说一句如果你连Python都还没装好那也别急着往下看代码先把安装和环境配置搞利索这步不过关后面全是折腾。我这里也简单回放一下安装过程里最容易翻车的几个点都是我亲眼见过身边同事踩过的。1.1 安装时90%的人会踩的两个坑第一下载Python的版本。请直接去Python的官方网站python.org注意域名是.org不要从什么“XX软件管家”“XX下载站”下载。不是我有强迫症是因为那些站点很容易捆绑一堆垃圾软件而且给的版本可能是老掉牙的2.x——Python 2已经在2020年停止维护了新学的朋友千万不要碰。目前主流是3.8以上版本直接下官网最新的稳定版就行。第二也是最关键的安装包刚弹出来时界面底部有个复选框写着“Add Python to PATH”这个一定要勾上。我见过太多人跳过这一步导致后续在命令行里敲python没有任何反应然后跑来问我是不是电脑坏了。这不是电脑坏了是系统压根不知道你安装的Python藏在哪个文件夹里。“PATH”你可以理解成系统的一个“通讯录”你把Python加进“通讯录”以后在任意路径下敲python命令系统才知道该去找谁干活。没加进通讯录你敲了名字人家也不认识你。装好之后验证一下在命令行Windows下按WinR输入cmd回车敲python --version能输出类似Python 3.12.x这样的版本号就说明安装成功了。再敲一下pip --version确认包管理工具也没问题后面装第三方库全靠它。1.2 编辑器选哪个别在工具上内耗太久第一天学的编辑器选择我在第三天想额外再说一句因为它真的影响学习体验。我个人对初学者的建议是别一上来就装那种全功能IDE也先别折腾人家说的什么“Vim大法好”。你就用两个二选一都行一个是VS Code加Python插件这个我目前的主力编辑器轻量、免费、插件生态全另一个是PyCharm Community版这个是专门为Python设计的IDE功能更全面但占用内存更大电脑配置不太够的跑起来会有点卡。选编辑器这事原则就是“别在上面花超过20分钟”。工具只是用来承载练习的不是学习本身。我当时第三天写代码时还在VS Code和另一个编辑器之间来回纠结浪费了一晚上后来彻底定下来用VS Code才把注意力放回代码本身。这件事给我的教训是编程入门阶段工具越简单越能聚焦。你打开编辑器就是为了写代码、跑代码、看结果这三个动作顺手就行别被花哨的主题和插件迷了眼。2. 深入理解变量与数据类型代码的“盒子模型”第三天开始我强烈建议你别再满足于“照着教程打出变量名”这种操作了而是要从底层理解变量到底是个什么东西。我习惯用生活里的“盒子模型”去理解它变量就是一个贴了标签的盒子标签叫变量名盒子里装的东西叫值。你往盒子里放数字3它就是一个整数变量你往盒子里放字符串“hello”它就是一个字符串变量。盒子里的东西可以换但标签得一直贴在那儿。这里有个初学者经常绕晕的细节变量名跟值是两个分开的东西。我见过有人问“为什么我给a赋了值3之后又把a赋给b再给a赋5b不会跟着变”这就是没理解盒子模型。你把a的值拷贝给b是拿了个新盒子然后贴上b的标签把原来a盒子里的东西复制了一份放进去。之后你修改a盒子里的东西b盒子里那个副本当然纹丝不动。这个细节如果你第一天没搞明白第三天一定要补上——它是后面学习列表、字典引用的基础那个更绕人。2.1 四种基础类型int、float、str、boolPython里最常见的四种基础数据类型我的记法是这样的int整数就是-1、0、1、100这种不带小数点。float浮点数就是带小数点的数比如3.14、0.5。别问为什么叫“浮点”你就当它表示“小数点可以浮动”的数理解就行。str字符串用引号包起来的文本单引号双引号都行比如hello、world。字符串是你打交道最多的类型之一。bool布尔值只有两个值True和False。这个在条件判断里是灵魂角色。想知道一个变量到底是什么类型就用type()函数。这个在调试时非常有用尤其遇到TypeError报错时十有八九是类型没搞对。咱们在第三天写代码时可以养成一个习惯给变量赋值后顺手print(type(变量名))看看确认自己的理解跟Python的实际判断是否一致。这个小习惯能提前避免很多低级错误。2.2 字符串格式化别用“”硬拼了第三天早晚会遇到把变量拼到字符串里输出的场景。新手最常见的写法是这样name 张三 age 25 print(我叫 name 今年 str(age) 岁了)这种写法能跑但体验很差你得惦记着“字符串只能和字符串用拼接”数字必须用str()先转成字符串括号一多就容易漏读起来也是一团乱麻。我第三天就开始改用f-string了Python 3.6以后都支持写法是在字符串前面加个小写的f然后把要嵌入的变量直接用花括号包起来name 张三 age 25 print(f我叫{name}今年{age}岁了)对比一下第二种写法是不是清爽太多了f-string不仅省事执行效率在Python 3.8以后也优于旧式的%格式化。我建议新手从第一天开始就直接学f-string省得以后再纠正旧习惯。2.3 input()的致命坑输入过来的全是字符串第三天如果想写点“交互式”的程序比如让用户输入一个数字然后程序再判断input()函数是绕不开的。它的作用就是从控制台读取用户敲进来的内容然后作为字符串返回。这句“作为字符串返回”就是新手最容易踩的坑了。我见过太多人写age input(请输入你的年龄) if age 18: print(成年了)然后运行时报错TypeError: not supported between instances of str and int。原因很简单input()返回的是字符串字符串跟数字没法直接比大小。你得先把字符串转成数字用int()这个函数age int(input(请输入你的年龄)) if age 18: print(成年了)记住一个口诀“凡是外部输入进来的值默认都是文本需要处理成什么类型就显式转一下。”这里顺便提一句如果用户输入了“abc”你再拿int()去转它还会报ValueError这个我们后面在异常处理那章再深入但第三天可以先有个印象用户输入是不可控的程序要提前有心理准备。3. 让代码学会判断if/elif/else的核心逻辑第三天最值得花心思理解的不是语法本身而是“程序是怎么根据不同的条件走不同分支”的。我推荐一个训练方法写任何if判断之前先在注释里用大白话把逻辑写出来。比如“如果成绩大于等于90输出优秀否则如果大于等于60输出及格否则输出不及格。”把这个逻辑理清了再翻译成代码你会发现if语句一点也不难。语法层面其实就那几个关键词if、elif就是else if的缩写、else。还有一点一定要时刻记住也是Python最有辨识度的地方——代码块靠缩进区分。其他编程语言大多用花括号{}Python用缩进一般四个空格来表示“这段代码属于哪个if分支”。这个机制逼着你规范排版新手刚接触时碎碎念最多的就是“为什么我的if下面那句代码老是不执行”。答案十有八九是缩进不对没有对齐在同一个层次。3.1 比较运算符与逻辑运算符对照表先背一张表这是条件判断能用的全部“裁判员”运算符含义示例结果大于5 3True小于5 3False大于等于3 3True小于等于3 2False相等注意两个等号a aTrue!不相等a ! bTrueand并且两边都真才真True and FalseFalseor或者一边真就是真True or FalseTruenot取反not TrueFalse这里第一个要敲黑板的就是判断“相等”用的是两个等号不是赋值用的一个等号。这个错误我刚开始学的时候一天犯八回写着写着就顺手if a 3了然后Python直接抛语法错误。另一个要注意的坑是and和or的混用。如果你想表达“60到90分之间”新手很容易写成60 score 90——这个Python是支持的等价于score 60 and score 90。我建议初学阶段统一用and、or写作完整条件逻辑更显式也更好排查问题。3.2 实操示例写一个成绩等级判断器光说不练假把式我们直接上手写一个。这段代码是我第三天练习时写下的非常典型覆盖了input、类型转换、if分支、f-string输出几乎把前面讲的知识点全串起来了# 成绩等级判断器 score int(input(请输入考试成绩)) if score 90: grade 优秀 elif score 80: grade 良好 elif score 60: grade 及格 else: grade 不及格 print(f你的等级是{grade})跑一下输入85输出你的等级是良好。整个逻辑流程非常直观从上往下逐个判断第一个满足条件的就执行对应分支执行完就跳过整个if结构继续往下走。这里有一个很关键的细节条件顺序不能乱换。如果你把if score 60写在if score 90前面那成绩95的也会先命中score 60输出变成“及格”。所以elif的判断顺序必须按照“先严格、后宽松”的原则或者把区间条件写完整if score 90、elif 80 score 90、elif 60 score 80这样顺序就不敏感了。这个经验我是吃过亏才总结出来的写条件时一定要想想条件的优先级和覆盖范围。4. 让代码学会重复for和while循环如果说if语句让代码有了“脑子”那循环简直就是让代码有了“体力”。人类重复做一百遍一样的事会烦躁计算机巴不得你让它干一万遍只要逻辑对。第三天的后半段我的主要精力就是跟循环过不去。循环分两种for循环和while循环。用我自己的大白话区分for循环是“我知道要循环多少次”比如“打印列表里的每一个元素”while循环是“我不知道多少次但我知道什么时候停”比如“直到用户输入正确密码为止”。记住这个区分后面选择用哪种循环时就不会犯迷糊。4.1 for循环与range()函数for循环最常配搭的是range()函数。range()可以生成一个整数序列最基础的用法三个参数range(stop)从0开始到stop-1结束比如range(5)生成0、1、2、3、4。range(start, stop)从start开始到stop-1结束比如range(2, 5)生成2、3、4。range(start, stop, step)第三个参数是步长比如range(1, 10, 2)生成1、3、5、7、9。注意stop是不包含的。这个规则初学者几乎都会记混一次我当时的记忆技巧是“左闭右开”就是左边包含右边不包含。可以联想一下你排队打饭队伍是从第你开始到你前面那个人结束队尾那个不进来。实操示例打印1到10的和total 0 for i in range(1, 11): total i print(total) # 输出55这段代码里total i就是total total i的简写。循环跑了十次每次把i的值累加到total上最终结果是55。怎么验证自己理解了改一下range求1到100的和答案是5050能一次跑出来说明你理解到位了。4.2 while循环与break、continuewhile循环写起来更简单只要条件为True就继续循环count 0 while count 5: print(f第{count 1}次循环) count 1这里要特别注意while循环如果没有count 1这个更新语句count永远不会变条件count 5永远为True程序就会陷入死循环。新手在这里最常见的翻车就是“程序卡住不动了”其实它是被困在死循环里出不来了。遇到这种情况在命令行运行的话按CtrlC强制终止如果是IDE里跑的话找红方块按钮停止。break的作用是“立刻跳出整个循环”continue的作用是“跳过本次循环继续下一次”。我举个例子说明区别for i in range(1, 10): if i 3: continue # 跳过3继续后面的 if i 7: break # 到7直接结束整个循环 print(i) # 输出1 2 4 5 6可以看到continue让3被跳过了7之后的数字因为break也没输出。这两个语句其实有点像游戏里的“退游戏”break是直接关掉游戏不玩了continue是这一局弃权跳到下一局。4.3 实操示例用for循环打印九九乘法表第三天我写的最有成就感的代码就是九九乘法表。它比单纯print强在它需要两层循环嵌套还要控制换行和对齐非常练手。for i in range(1, 10): for j in range(1, i 1): print(f{j} × {i} {i * j}, end\t) print()解释一下这段代码的执行逻辑外层循环i从1取到9代表乘法的第二个数或者叫行号内层循环j从1取到i代表第一个数。end\t的意思是print结束后不换行而是用制表符分隔下一条内容内层循环跑完一行后再调用一个空的print()实现换行。运行结果1 × 1 1 1 × 2 2 2 × 2 4 1 × 3 3 2 × 3 6 3 × 3 9 ...你可能会想这也不是标准的右上三角啊没关系核心在于你已经理解了“嵌套循环里外层跑一轮、内层要跑完一整轮”这个执行机制。这就是程序的“时钟运行”节奏弄明白了这个后面的排序算法、二维数组遍历就都是它的变体。5. 第三天综合实战做一个“猜数字”小游戏第三天的收尾项目我给自己布置了一个“猜数字”小游戏。这个项目几乎是Python入门阶段的“保留节目”因为它的覆盖面太经典了随机数生成、input输入、类型转换、条件判断、while循环、break语句、计数器……几乎把第三天学的所有知识点全用上了而且做出来的东西还能真的跑起来让人玩特别有成就感。需求拆成三步程序随机生成一个1到100之间的整数。玩家不断输入数字去猜。程序提示“猜大了”“猜小了”猜中就显示“恭喜你”并统计猜了几次。5.1 完整代码与逐段拆解先上完整代码import random target random.randint(1, 100) guess_count 0 print(猜数字游戏开始猜一个1到100之间的数字吧。) while True: guess int(input(请输入你的猜测)) guess_count 1 if guess target: print(猜大了再试一次。) elif guess target: print(猜小了再试一次。) else: print(f恭喜你猜对了数字就是{target}。) print(f你一共猜了{guess_count}次。) break逐步解读第一行import random是导入Python的标准库模块用模块里现成的random.randint(1, 100)来生成随机数。注意一定要在使用之前import这是规矩。guess_count 0作为计数器每次循环加1。while True是死循环表示“一直猜下去”它的出口在猜对时的break。每次猜完判断三种情况大、小、刚好。这里有一个细节我觉得值得单独说一下int(input(...))这一行如果用户输入了非数字程序会直接报ValueError崩溃。我在第三天就知道这个坑但故意没写异常处理因为当时的知识储备还没到。如果你自己也卡在这不必急着去查try/except先记住这个缺陷等学到后面再回头补上这也是一个很好的学习线索——你会带着问题去学异常处理。5.2 扩展思路让游戏更好玩基础版跑通以后我建议你立刻做扩展练习。比如设置猜测次数上限超过上限直接Game Overmax_tries 10 while guess_count max_tries: ... else: print(f机会用完了正确答案是{target}。)又比如把数字范围扩大到1到1000或者加一个“猜完一次之后问玩家是否继续新一轮”的逻辑。这些扩展每个都不难但它们能强迫你去思考“原来的代码哪块需要改动”“改动会不会引入新bug”。这种思考本身就是极好的训练。我始终觉得入门阶段拉开差距的不是你看了多少教程而是你在每个案例上“折腾”了多久。6. 第三天高频报错速查表报错是老师第三天的实操中我敢说没有一个人能完全避开报错包括我自己。报错并不可怕我甚至觉得“每天都在报错”反而是个好信号——说明你在写新代码、碰新问题、扩展能力边界。最可怕的是那种“永远不报错”的状态那大概率是你在舒适区里重复已经会了的东西。要学会跟报错相处第一步是读懂报错。Python的Traceback回溯信息其实非常友好它会明确告诉你文件路径、报错的行号、错误类型和错误描述。我列一个第三天的报错速查表碰到问题直接对照报错类型常见原因解决思路SyntaxError: invalid syntax语法错误多半是括号没配对、冒号忘了写检查报错行附近的标点符号特别是if/for/while定义的结尾有没有冒号NameError: name xx is not defined变量名拼写错误或者变量还没定义就使用检查变量名是否拼写一致是否在赋值之前就引用了TypeError: not supported between instances of str and int类型不匹配比如字符串和数字比大小用int()或float()把输入值转成数字类型IndentationError: expected an indented block缩进有问题通常是走到冒号后面却忘了缩进按下Tab键或四个空格保证代码块内部缩进一致IndexError: list index out of range访问列表的下标超范围了检查下标是否从0开始数的判断下标是否超出len(list)-1ZeroDivisionError: division by zero除数为0检查除法运算的右边是否可能取到0增加判断条件排查报错有个笨但极其实用的方法把你怀疑出错的代码段一行一行删除直到报错消失那问题就出在最后删除的那一行里。这个方法在第三天完全够用不需要太复杂的调试工具。6.1 读懂Traceback定位报错的三步法第三步的实战我总结了一套三步定位法先读最后一行那行写了错误类型和简单描述。比如NameError: name guess is not defined它已经告诉你三个信息错误类型是NameError出错的名称是guess原因是未定义。再从Traceback里找到File xxx.py, line N的提示那里写了出错的具体行号直接跳到该行看。结合上下文判断是不是变量拼写不一致是不是类型没转对是不是缩进错了大部分时候这些“低级错误”一眼就能查出来。6.2 print调试法编程最简单也最有效的调试手段当年还是小白的我在第三天就学会了一个受用至今的调试技巧——print调试法。逻辑很简单在程序的关键节点插入print语句把中间变量打印出来看看程序执行到哪一步、变量值是否符合预期。比如怀疑循环有问题就在循环里打印当前i的值怀疑if条件有问题就打印条件的比较结果。total 0 for i in range(1, 5): total i print(f第{i}次循环此时total{total})运行后你就能清楚地看到total从1到10一步步累加的过程哪一步出问题一目了然。等程序稳定运行后把调试用的print注释掉或删掉即可。虽然现在Python有pdb但是第三天的你完全不需要学那些花哨的调试器“print大法”足以解决90%的入门问题。7. 第三天学习方法的复盘与心得最后我想聊聊比具体代码更重要的东西学习方法和心态。第三天是一个“劝退点”但它也可以是一个“入门点”区别在于怎么应对挫折。我建议所有自学者把自己的学习节奏从“跟着教程敲代码”切换成“带着任务写代码”。具体做法是每学完一个知识点立刻给自己出一个小题目要求只能用到目前学过的内容然后独立完成。比如学完if就写一个“输入星期几提示今天是否有课”的小程序学完for就写一个“输出1到100的所有偶数”的程序。这些小题目不需要复杂但必须是自己动脑设计的跟教程例子区分开。第三天学到末尾我给自己定的规矩是“不管多晚每天至少写20行原创代码”。原创的意思是不抄教程哪怕写一个特别笨拙的数字累加器也行关键是自己的脑子和手共同完成。“看懂”和“会写”之间有一条巨大的鸿沟唯一能填平它的就是动手。另一个体会是不要把“记不住语法”等同于“没天赋”。Python的语法细节非常多哪怕工作了多年的程序员写代码时也经常要查文档。你需要的不是把每个函数参数都背下来而是记住“大概有这个工具具体用法可以查”。真正重要的是前面讲的这些逻辑——程序的分支、循环、结构、数据如何流动。这些逻辑比语法更底层也更通用就算你以后学别的编程语言它们依然成立。我在第三天结束的时候把之前记的笔记翻了一遍发现前两天很多似懂非懂的零散知识点在学完条件判断和循环之后突然开始自动串联起来了。这是常有的事编程的学习不是线性的而是螺旋上升的。你以为第三天学的只是两个新语法实际上它可能让你重新理解了第一天的print和变量。所以如果你在第三天的某个瞬间产生了“原来之前那个代码可以这样写更好”的顿悟感恭喜你这个门已经跨进来一半了。