
如果你已经学 Python 学到第五周那么大概率到了一个特别容易放弃的节点语法刚学完一小半网上那些教程开始默认你已经会装环境、会配 IDE、会处理各种报错可你实际打开电脑一跑不是pip装不上包就是本来就懂的代码换个地方就报错。这篇周记就是帮你把这个第五周瓶颈拆开揉碎把该补的环境、语法、调试和练手项目一条条捋清楚。这一周的核心任务不是在学更多新语法而是把前面攒下来的碎片知识串起来会装环境、会配置解释器、会装第三方库、能读懂报错、能跑通一个带数据的小项目。如果你正处于Python 学了五周但总感觉自己还不会的迷茫期或者刚安装完 Python 不知道怎么继续往下走这篇内容就是按这个阶段的实际需求写的。1. 第五周这个节点到底卡在哪里1.1 从看教程到跑代码的跨越前四周你多半跟着教程跑变量、循环、函数、列表、字典每一章都有配套小练习感觉挺顺的。可到了第五周画风突然变了——教程开始假定你已经掌握基础然后直接丢给你一个爬虫代码或者一个数据分析脚本里面蹦出来requests、pandas、matplotlib这些你听都没听过的东西。教程会说先pip install一下可你连pip是什么、装完去哪了、为什么 IDE 里还是ModuleNotFoundError都不知道。这个阶段真正的分水岭不是语法难度而是环境工程。你需要理解三件套的关系Python 解释器负责执行代码第三方的库负责提供现成功能IDEVSCode 也好 PyCharm 也好负责让你写代码和看结果。三者各干各的其中任何一环没对上你就会看到为什么我的 Python 学习路线在这里断了的绝望瞬间。打个比方前四周你是在学开车——点火、挂挡、踩油门都是在模拟器里。第五周你要上真实道路了结果发现不仅要会开车还得会看导航、会处理加油站、会面对真实路况。导航就是 IDE 和调试工具加油站就是第三方库的安装和源配置真实路况就是各种异常和报错。1.2 第五周应该掌握的目标清单我建议第五周先别急着学新技术而是围绕四个硬指标检验自己能在一个干净的环境下从下载安装 Python 开始独立完成解释器安装、PATH 配置、IDE 关联、第三方库安装全流程。能不看教程手写出一个小脚本读入一个文件或网络数据做一点处理和计算再输出结果。遇到ModuleNotFoundError、cannot be resolved against python helper roots、ValueError这类报错时能根据报错信息定位到问题位置而不是直接懵住。能跑通一个包含第三方库的小项目比如用requests拿数据、用pandas做清洗、用matplotlib画一张图。注意这些指标没有一个是学会了某某高级语法全是能不能独立把事儿跑通。因为第五周之后你的学习方式会从跟着教程敲代码变成按需求查资料拼代码如果环境不通、报错不会看后面的路会越走越累。2. 环境整理把安装和配置一次学透2.1 安装 Python 时最容易埋雷的细节先聊安装。很多人在这一步看似装好了实际埋了两个雷一个是没勾选Add Python to PATH另一个是装了个奇怪版本的 Python 却不自知。下载安装最稳的路径是去 Python 官网下载中心找Windows installer (64-bit)那个双击运行第一屏务必勾选最下面的Add python.exe to PATH然后点Install Now。别小看这个勾选它决定了你后面在终端里能不能直接敲python命令。有个小技巧勾选后安装完打开一个新的终端Windows 上是 CMD 或 PowerShell注意得是新开的窗口才生效输入python --version如果输出版本号说明 PATH 没问题如果提示不是内部或外部命令多半就是 PATH 没配上。在 Windows 上还有个小细节如果你用微软商店安装的 Python命令可能是python也能用但第三方包和依赖的路径可能会和官网版不一样很多奇怪问题就是这么来的。我个人的习惯是学习阶段统一用官网安装包不要混用商店版。Linux 系统下安装 Python 则是另一套逻辑。很多发行版自带的是 Python 3.8 或 3.10 之类的老版本你要是想装 3.11 以上推荐用源码编译安装但这是个深坑依赖库比如libssl-dev、zlib1g-dev少装任何一个最后都会在make阶段蹦出一堆看不懂的错误。我能给的最实用建议是如果只是学习 Python先用系统自带的版本把语法和环境跑通不要一上来就跟编译安装较劲。等你确实需要新版本特性时再用隔离开的版本管理工具比如pyenv来装而不是直接在系统里替换默认 Python。2.2 pip 换源解决下不动库的核心方案pip是 Python 自带的包管理工具但你如果用默认源下载经常会遇到速度极慢、超时失败等问题。这不是你网不行而是默认源在国外网络路径远。解决办法就是换成国内镜像源。我知道你会搜到一堆源地址什么清华、阿里、豆瓣的都有其实挑一个顺手稳定的就行。以清华源为例pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple执行完这一条以后所有pip install都会走镜像源速度快很多。如果你只想临时用一次也可以在安装时加-i参数pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple对于新手我强烈建议直接用第一条永久配置省心。因为热词里反复出现的python 安装 numpy 库的方法python 国内源这类问题本质就是这一件事没做。2.3 VSCode 配置 Python 环境重点关注这个报错VSCode 是很多 Python 学习者的首选编辑器轻量、免费、插件生态好。但它毕竟是通用编辑器Python 环境的关联要靠插件来完成。热词里有一个非常典型的报错cannot be resolved against python helper roots这个我五周时也踩过。这个报错出现的位置通常在 VSCode 的 Python 扩展运行某些功能比如代码补全、检查、运行时意思是Python 扩展无法定位到解释器所依赖的辅助文件根目录。说白了就是扩展认为你应该有 Python但我找不到它该在哪儿。遇到这个报错的排查顺序在 VSCode 里按CtrlShiftP输入Python: Select Interpreter看看当前选中的解释器是不是一个真实存在的路径。如果显示的是无解释器或一个无效路径就要重新选择。正常情况下你应该能看到类似Python 3.11.x (base: conda)或Python 3.11.x 64-bit这样的项。确认你选的解释器确实能用。在终端里输入该解释器的完整路径再执行python --version如果这条路本身是坏的VSCode 当然找不到helper roots。如果解释器路径没问题但仍然报错很可能是扩展本身的缓存问题。CtrlShiftP输入Developer: Reload Window重载窗口或者直接卸载重装 Python 扩展。还有一个容易被忽略的坑如果你的工作区里有多个环境比如同时装了 Anaconda 和官方 PythonVSCode 会自动选用它认为最合适的那个而这个不一定是你想在当前项目里用的。逐个选择解释器试一遍往往能解决。还有一种比较少见但能遇到的情况你在 Windows 上用了软链接或者把 Python 安装在路径含中文或空格的目录里导致扩展解析路径失败。路径越简单越好C:\Python311比C:\Users\张三\AppData\Local\Programs\Python\Python311\靠谱得多。2.4 PyCharm 配置虚拟环境是什么为什么需要它如果你偏爱 PyCharm配置逻辑和 VSCode 略有不同但核心概念一致项目要绑定一个解释器。创建新项目时PyCharm 默认会让你选择New environment using Virtualenv然后选基础解释器Base interpreter。很多新手不理解这个虚拟环境是干啥的我解释一下虚拟环境就是给每个项目单独开一个独立的小仓库你在这个项目里装的第三方库只属于这个项目不会污染全局。好处是 A 项目用了requests 2.28B 项目用requests 2.31互不干扰。坏处是一开始你会觉得我明明全局装过这个包了为什么这个项目还是找不到——因为它找的是自己的虚拟环境的包列表。对于学习阶段我建议养成一个习惯每个项目单独建虚拟环境然后在项目终端里安装依赖。虽然步骤多了一层但这是职业习惯而且能帮你规避大量明明装了却 import 不到的问题。PyCharm 里底部状态栏会显示当前解释器路径点一下就能切换多看看它你就能理解我的代码跑在哪个 Python 上这件事了。2.5 第三方库安装的踩坑cv2、numpy、flet 的细节热词里出现了python 下载 cv2、python 安装 numpy 库、python flet这些都是典型的第三方库安装需求。先记住一个原则你 import 的名字和 pip 安装的名字不一定相同。比如import cv2但这个库在 pip 里叫opencv-python所以你安装命令是pip install opencv-python如果你直接pip install cv2大概率会报ERROR: No matching distribution found for cv2。这就是热词里python 下载 cv2最可能卡住的原因。numpy就老实得多名字完全一致pip install numpy装完可以用一个万能验证法在任何目录下打开终端进入 Python 交互环境python import numpy print(numpy.__version__)如果输出了版本号说明装好且可用。这一步值得每次安装后都做因为它能把你是否装好和是否被 IDE 正确识别这两个问题拆开。flet这两年很火因为它是 Python 写 GUI 应用的库还能打包成 APK。但我想泼一盆冷水第五周先别碰打包 APK 这条路。Flet 本身可以学因为它的 API 写起来简单用纯 Python 就能做界面但打包 APK 涉及构建环境、Android SDK、依赖裁剪一堆深坑不是现在该碰的。你要是实在好奇装一下pip install flet跑个计数器 Demo 体验一下就行打包留到后面。3. 语法冲刺攻克那些似乎懂但写不对的知识点3.1 赋值和引用的区别这是无数 bug 的源头热词里有python 赋值这个知识点看着基础但第五周回头看你会发现自己其实理解得很浅。关键在于在 Python 里不是把值复制一份给新变量而是让新变量指向同一个对象。对数字和字符串这种不可变类型你感知不到区别但对列表、字典这种可变类型坑就来了a [1, 2, 3] b a # b 和 a 指向同一个列表对象 b.append(4) print(a) # [1, 2, 3, 4]你以为只改了 b结果 a 也变了如果你想要一个独立副本需要用切片或者copy模块b a[:] # 浅拷贝一份 b a.copy() # 等价写法这个知识点跟爬虫、数据处理关系极大因为你在清洗列表数据时如果没意识到引用问题很容易出现原数据被顺手改了的情况。3.2 abs 函数比你想的更宽热词里出现python abs 函数我猜是因为第五周开始接触数学计算和数据处理绝对值成了高频操作。abs()的返回值规则不难传整数返回整数绝对值传浮点数返回浮点数绝对值传复数返回模magnitude传十进制数返回十进制数。print(abs(-5)) # 5 print(abs(-3.14)) # 3.14 print(abs(3 4j)) # 5.0复数的模abs本身不复杂但有一个使用场景容易出错当你从一个 api 或文件里读到的是字符串-5而不是数字-5时直接abs(-5)会报TypeError: bad operand type for abs(): str。这时要先abs(int(-5))做类型转换。这和类型转换知识点正好联动起来。3.3 类型转换别让 ValueError 打断你热词里python 类型转换是高频搜索说明这个点虽然简单但新手在实战中经常吃瘪。核心要记住的是int()、float()、str()这几个内置函数能转换的输入有限制不是让你随便转的。int(3) # 3正常 int(3.14) # ValueError: invalid literal for int() with base 10: 3.14 int( 42 ) # 42会先去掉首尾空格 float(3.14) # 3.14正常 int(三) # ValueError中文数字也不行我在数据处理时最常用的场景是从 CSV 或 JSON 里读出来的都是字符串要想做计算就必须整体转一遍data [12, 34, 56] nums [int(x) for x in data]如果确定数据里可能有非数字就用一个更健壮的写法def safe_int(x): try: return int(x) except (ValueError, TypeError): return 0这个转换异常处理的套路在真实项目中比裸转可靠得多。3.4 协程第五周了解即可但概念要拎清热词里有python 协程说实话这个知识点对第五周来说偏难但架不住教程里总提到所以你得先能看懂是个啥。协程说白了就是一个函数执行到一半时可以主动让出控制权等某个操作完成后再回来继续执行。Python 里最简单的协程长这样import asyncio async def say_hello(): print(start) await asyncio.sleep(1) print(end) asyncio.run(say_hello())async def定义一个协程函数await表示在这里暂停一下等后面的操作完成再继续。它主要用于 IO 密集场景比如爬虫里同时请求多个网址。如果你现在看不懂完全不用焦虑先把普通函数、循环、文件读写这些基础打牢。当你能熟练写普通爬虫后再回来看协程会发现这就是同样时间内多开几路请求的工具罢了。4. 练手项目把爬虫、数据处理和可视化串起来4.1 为什么爬虫是第五周最好的综合练习热词里一大半是爬虫相关python 爬虫教程、python 爬虫可视化界面、爬虫python入门。爬虫之所以在这个阶段这么命中率高是因为它是一个完美的综合项目你要用requests发请求网络、字符串、编码、要用BeautifulSoup或正则解析字符串操作、循环、列表、要用csv或json保存结果文件操作、可能还要用pandas和matplotlib做分析和展示第三方库、类型转换、数据清洗。换句话说爬虫把前四周学到的语法全部用起来了而且它有明确的输出——你抓下来的数据是看得见摸得着的这种正反馈比做题强得多。4.2 一个能跑通的入门案例我建议第五周做一个最简单的爬虫比如从某个公开的 JSON 接口读取数据然后分析和可视化。为了不涉及任何合规争议别去爬登录后才能看的页面只选公开数据。下面我用一个模拟的思路展示结构实际使用时你把 URL 换成你确定可访问的公开接口即可import requests url https://api.github.com/repos/python/cpython # 公开的仓库信息接口 resp requests.get(url, timeout10) data resp.json() # 将 JSON 字符串解析为 Python 字典 print(data[full_name]) print(data[stargazers_count])这一步跑通了你就完成了发请求-收响应-解析数据的最小闭环。接下来再加一层用列表推导式整理多条数据再存成 CSVimport csv rows [ {name: cpython, stars: data[stargazers_count]}, {name: django, stars: 0}, ] with open(stars.csv, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnames[name, stars]) writer.writeheader() writer.writerows(rows)注意encodingutf-8这个参数在 Windows 上写 CSV 时如果不指定默认可能用 GBK 编码用 Excel 打开乱码问题就是这么来的。4.3 用 pandas matplotlib 做数据分析爬下来的数据拿到手下一步是分析和可视化。这里用到的是热词里反复出现的python 数据分析与可视化。pandas的核心数据结构是DataFrame你可以把它理解为一张 Excel 表格。从 CSV 读入import pandas as pd df pd.read_csv(stars.csv) print(df.head()) # 前五行 print(df[stars].sum()) # 求和然后用matplotlib画图import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 解决中文乱码 plt.rcParams[axes.unicode_minus] False # 解决负号显示成方框 df.plot(kindbar, xname, ystars) plt.title(星标数对比) plt.show()这里有两个高频坑一是matplotlib默认字体不支持中文SimHei是 Windows 下的黑体Linux 下可能要换成WenQuanYi Zen Hei或Noto Sans CJK SC二是负号显示问题加了第二行配置就能解决。走到这一步你就已经完成了爬虫-存数-清洗-可视化的完整链路。这是第五周最值得投入时间的练习因为它直接打通了后续做数据分析、量化交易策略热词里也有的基础能力。4.4 关于可视化界面先别搭界面先让数据跑通热词里python 爬虫可视化界面出现频率挺高这大概率是受到了一些教程截图的影响一个 GUI 窗口左边输入网址右边显示图表看起来特别酷。但我的真实建议是第五周先别做可视化界面。原因不是难而是它插入了一个UI 编程的新维度把注意力从数据流转移到了控件怎么布局。你很容易陷入代码都能跑但窗口怎么都不弹出来或者窗口出来了但数据不刷新的泥潭。正确的顺序是先用命令行或脚本让数据链路通再用flet或PyQt做界面。界面是锦上添花不是核心。等你能把爬到的数据画成图输出到本地文件之后再去想怎么把这个过程包装成一个界面你会发现那时做界面轻松很多因为你已经确切知道自己要在界面上展示什么了。5. 编程习惯筑基编码、调试和异常处理5.1 解决编码混乱提前避开中文乱码问题很多 Python 初学者第一次觉得自己搞不定编程就是从一堆乱码开始的。源文件里写了中文注释一运行报SyntaxError: Non-UTF-8 code starting with ...打印中文到控制台显示成乱码读 CSV 中文内容出来一堆乱码。这些跟 Python 的编码机制有关。Python 3 的源文件默认是 UTF-8 编码所以写代码的文件本身用带 UTF-8 保存一般没问题。出现乱码更多是在读写外部文件时没指定编码# 读文件时指定 utf-8 with open(data.csv, encodingutf-8) as f: content f.read() # 写文件时也建议显式指定 with open(out.txt, w, encodingutf-8) as f: f.write(中文内容)一个小经验如果文件是从老系统或 Windows 自带程序如记事本老的默认里来的可能是 GBK 编码这时把encodingutf-8换成encodinggbk再试。如果你不确定文件什么编码用chardet库检测一下pip install chardetimport chardet with open(data.csv, rb) as f: raw f.read(1000) print(chardet.detect(raw))5.2 异常处理 try/except 不是吞错误第五周你会开始接触外部输入——文件、网络请求、用户输入。这些都有一个特点结果不可控。文件可能不存在网络可能超时用户可能输入了乱七八糟的东西。如果完全没有异常处理一行报错就整个崩溃第五周的你大概率会因此沮丧很久。try/except是最基础的防御式写法try: num int(input(请输入数字)) except ValueError: print(输入的不是合法数字)但我要特别提醒新手容易把except写成出了错就当无事发生。这是坏习惯异常处理最重要的原则是要么给出替代方案要么明确提示和记录而不是静默吞掉。一个更稳妥的写法是try: result risky_operation() except Exception as e: print(f出错了{e}) # 这里至少要告诉用户发生了什么 else: # 没出错时才执行 print(f结果{result})5.3 调试方法从 print 到断点第五周开始print调试已经不太够用了。你会有这种时刻数据量一大打印出来的内容根本看不过来或者你根本不知道某个中间变量的值是什么。我建议你至少学会 VSCode 或 PyCharm 的断点调试。操作上就是在代码行号左侧点一下出现红点然后按 F5 调试运行。程序会停在断点处你能看到所有变量的当前值。这一招在排查为什么结果和我预期不同时极其好用比到处加print高效得多。我自己的习惯是遇到 bug 先问是数据不对还是逻辑不对。在代码里找到最可疑的点打断点停在它前面看那个点的输入变量是不是符合预期。如果输入就不对往上游找如果输入对但输出不对往当前逻辑找。这种二分定位法能帮你把排查范围快速缩小省去瞎猜的时间。6. 趣味项目里的语法宝藏爱心、烟花、四叶草和经典题目6.1 爱心代码和烟花代码图形库与数学公式的结合热词里python 爱心代码python 烟花代码很火这类项目的价值不在能做出多炫的图而在于它用了图形循环坐标计算是理解程序如何控制输出的好素材。常见的爱心代码用的是turtle库核心是参数方程画曲线import turtle import math t turtle.Turtle() t.speed(0) for i in range(360): x 16 * math.sin(math.radians(i)) ** 3 y 13 * math.cos(math.radians(i)) - 5 * math.cos(2 * math.radians(i)) - 2 * math.cos(3 * math.radians(i)) - math.cos(4 * math.radians(i)) t.goto(x * 20, y * 20) turtle.done()这里math.radians把角度从度转成弧度**是幂运算math.sin/cos是三角函数。看起来花哨内核就是根据不同角度算出坐标然后移动画笔。如果你能看懂这段代码说明你的数学函数运用和循环已经过关了。烟花代码类似通常是用random和turtle在屏幕上随机位置绽放核心是模拟粒子的运动和随机性。这类项目练习两个点random模块的用法和同一套代码用不同参数跑出不同效果的思维。6.2 四叶草循环嵌套和图层的节奏感四叶草项目也多用turtle画核心思路是画四片叶子每片叶子转 90 度。看起来简单但要用到for循环嵌套外层循环控制叶片数量内层循环画一片叶子的曲线。import turtle t turtle.Turtle() t.speed(3) for _ in range(4): for _ in range(2): t.circle(100, 90) # 画四分之一圆 t.left(90) t.right(90) turtle.done()这段代码不用逐行背但你要能理解外层转一圈内层画一个花瓣的嵌套关系。这种循环套循环是 Python 里很核心的抽象能力写爬虫时遍历翻页、写数据分析时按年按月聚合背后都是这种嵌套逻辑。6.3 李白打酒一道经典递推题的 Python 解法李白打酒是算法入门里的名题李白提着酒壶路过酒店酒加一倍遇到花喝一斗最后喝完。经典版本是遇店加一倍见花喝一斗三遇店和花喝光壶中酒试问壶中原有多少酒。用 Python 做这类题思路是逆向递推从最后的状态往前推。假设最后壶中 0 斗酒倒着走遇花就加一斗遇店就减半wine 0.0 # 从后往前先遇到花喝掉一斗再遇到店加倍 for _ in range(3): wine 1 # 遇到花喝掉一斗 倒推回加一斗 wine / 2 # 遇到店酒加一倍 倒推回减半 print(wine)这个题的妙处在于它能训练你先拆解问题、再选择正向模拟还是逆向推导。很多分析类项目都会遇到从结果反推原因的场景这道题是一个极佳的最小训练单元。顺带说一句这类题完全不需要装任何第三方库纯标准库、纯逻辑特别适合用来检验失去教程提示后我能不能自己写出来。7. 学习资源与工具第五周把你常用的入口固定下来7.1 文档和网站推荐热词里有python 学习网站python 基础语法说明大家还是在搜教程、搜网站。我的建议是别囤固定用几个就够官方文档docs.python.org查语法和标准库最权威就是英文的刚开始读着会慢但值得硬啃。看内置函数时直接搜abs、int解释比任何二手教程都准确。菜鸟教程runoob.com适合快速查语法中文简单直接。GitHub 搜索搜python 小项目能看到大量真实代码看别人怎么写项目结构、怎么组织函数。另外一个非常实用的习惯在搜索引擎里搜报错信息的原文。比如cannot be resolved against python helper roots你直接搜这串英文要比搜VSCode 报错高效十倍。报错信息是程序给你的精确线索不要自己翻译成模糊的中文再去搜。7.2 建立代码随手存的习惯第五周开始你写的代码量会快速增加但你要是不做整理很快就找不到上周写过的那个爬虫脚本了。我建议建一个简单的目录结构按日期或主题存python-learning/ 05-week/ crawler/ analysis/ fun/每个小项目一个文件夹放一个readme.md写三行说明做了什么、核心逻辑是什么、还缺什么。别看这个习惯简单它能让你在第六周、第七周回头复用代码时省下大量时间。真实项目里代码的可维护性往往比写得快重要得多。7.3 关于在线编译器和本地环境的取舍热词里有python numpy 在线编译器新手有时会喜欢用网页版直接跑代码。在线编译器的好处是零配置、快速试小片段坏处是没办法体验真实的文件操作、第三方库安装和调试过程。第五周之后我建议主线放在本地环境在线编译器只用来临时跑个不涉及第三方库的小测试。道理很简单你最终要做的是在自己电脑上写项目、跑项目、部署或者打包如果始终活在什么都被配好的在线环境里一到本地就手足无措永远无法真正独立。8. 常见问题速查表第五周遇到这些报错直接对照解决报错或现象可能原因快速解法python 不是内部或外部命令安装时没勾选 Add to PATH重装勾选或手动添加环境变量pip 不是内部或外部命令Python 安装不完整或 PATH 缺失重新检查安装确保 Scripts 目录在 PATHModuleNotFoundError: No module named requests没装或装到了别的环境先pip install requests再确认 IDE 解释器与 pip 对应同一环境ImportError: cannot import name xxx库版本太低或函数名写错升级库pip install --upgrade 库名检查版本对应文档cannot be resolved against python helper rootsVSCode 解释器路径异常或扩展缓存重选解释器、Reload Window、重装扩展ValueError: invalid literal for int()字符串转 int 时内容不是整数先查看原始字符串内容清理空格或非数字字符UnicodeEncodeError: gbk codec cant encode character控制台编码和字符不匹配在写文件或输出时指定encodingutf-8或在代码开头加# -*- coding: utf-8 -*-pip install 超时或速度极慢默认源在国外配置国内镜像源numpy装好后 IDE 里仍报找不到IDE 选了解释器 A包装到了解释器 B在 IDE 里重新选择解释器或在项目的终端里pip install代码能跑但结果和预期不符逻辑错误或数据问题用断点调试先确认输入数据是否符合预期这张表是我实际使用中总结的不一定覆盖所有情况但第五周最常遇到的就是这几类。最后再分享一套我个人的使用习惯每次装完一个新库先在交互环境里import一下并打印版本号确认它真的可用每次新建项目先配好虚拟环境和编码再写业务代码。这些小动作看起来耽误几分钟实际上在为你后面省下大量时间。Python 学习到第五周最大的进步不是又学会了一个新语法而是我能在没人帮我的情况下把一个东西从零跑通。这个能力的建立比任何具体知识都值钱。