
每当有人问我“Python 练习”应该从哪里开始我通常不会直接扔一套题单过去。因为练过的人都知道真正卡人的往往不是题目难而是环境还没跑顺就泄气了。这些年我带过不少从零起步的新手也见过太多人收藏了“Python经典100题”就再也没有打开过最终坚持下来的人基本都有一套从环境、语法、数据处理再到实际场景的渐进式练习路径。这篇文章就按这条路径把我会怎么练、怎么带新人练以及练习过程中最容易踩的坑一次性讲清楚。1. 练习前先把环境收拾利索安装、解释器与编辑器1.1 一台电脑装好Python的三个要点很多新手下载Python时图快一路点Next结果等要用的时候在命令行里敲python系统提示“不是内部或外部命令”。这句话90%以上的人第一次看到都会懵。其实问题基本就出在安装时没有勾选“Add Python to PATH”导致系统不知道去哪找python.exe。Windows用户在官网下载安装包后第一步先勾上这个选项再继续安装能省掉后面配环境变量的一大堆麻烦。如果已经装完了但没有勾选也别急着重装。打开系统设置里的“环境变量”在Path中手动加上Python安装目录以及它的Scripts子目录。例如装在C:\Python313就添加C:\Python313和C:\Python313\Scripts。改完保存重新开一个命令行窗口敲python --version验证一下。Linux环境下的安装也有不少门道如果你用的是Ubuntu这类系统系统通常会自带一个Python 3版本不一定最新但足够练习。用sudo apt install python3可以补装一些官方包更推荐直接从官网下载源码编译或者用pyenv管理多版本这样能避免系统依赖被搅乱。如果说给新手的建议我会推荐从Anaconda这类发行版开始而不是裸装官方Python。原因不是官方版不好而是后面练习numpy、pandas、matplotlib、sklearn时用Anaconda自带的conda包管理器处理依赖很省心不用逐个记pip参数。我自己带新同事时也让他们先装Anaconda先把前面几章练动起来再回头补命令行装包的知识。1.2 VSCode还是纯文本编辑器怎么配置最省心编辑器不需要纠结太久。如果你只是练基础语法笔记本自带的文本编辑器配合命令行就能跑这样对代码本身的理解反而更扎实。但人都有惰性纯命令行敲代码反馈太慢写错一个括号要等运行才知道。所以我建议用VSCode免费、轻量、生态成熟网上关于“vscode python环境配置”的教程一搜一大把自己摸索也不难。VSCode配置Python开发环境的关键就两步。第一步去扩展市场搜“Python”安装微软官方出的那个插件第二步按CtrlShiftP输入“Python: Select Interpreter”选中你刚装好的解释器。这一步很多人漏掉结果插件装了但解释器还是默认的代码能跑倒是能跑可用了Anaconda环境却识别不到后面装什么包都会乱。配置完之后新建一个后缀为.py的文件输入print(hello)点右上角的小三角运行图标到这一步你的本地练习环境就算通了。曾经有人问我为什么不推荐PyCharm其实PyCharm也很好但很多练习场景用不上它那些重型功能VSCode启动更快目录管理也更随意适合边写边扔的练习项目。2. 基础语法练习变量、函数、类型转换、切片的专项操练2.1 变量的类型与动态性练习Python变量最反直觉的一点是它不需要声明类型但每个变量背后其实都有明确的类型。我在让新人练变量的时候很少让他们背概念而是让他们做一组可以立马上手的小实验。比如a 10 b 10 print(type(a)) print(type(b))跑完这两行再让他们试试a b系统会抛出TypeError然后他们就会理解“类型不一致会报错”是怎么回事。接着我还会让他们练id(a)和a is b去感受“变量是对象的引用”这个底层逻辑。这种实验式练习比题单更有效。我见过不少人把“变量的类型练习题”做成选择题表示“哪个是合法变量名”但真正判断一个变量名是否合法靠的是动手写。建议新人为每个内置类型至少写一个实验小脚本包括int、float、str、bool、list、tuple、dict、set打印出各自的type()和len()。做完这一轮后面学函数和对象才会顺。2.2 类型转换的坑和练习设计类型转换是必修课但很多人都忽视了一个大坑转换的时机。字符串和数字混在一起的时候str(123)和int(123)都能转可int(12.3)就会报错而float(12.3)可以成功。我问过不少新手这个问题十有八九答错。建议自己设计一个小练习把一份凌乱的数据列表整理成统一格式比如从[12, 34, 5.6, 78.9]提取出所有数字并求和。你会被迫考虑每个元素到底是什么类型以及用什么转换最安全。另一个值得做的类型转换练习是布尔值转换。很多Python入门教程都略过了bool()的细节但理解bool()、bool([])、bool(0)都是False以及bool(False)是True这件事能帮你避开无数坑。如果你写过判断表单字段是否为空的代码大概率遇到过这类问题。我通常会让新人写一个“转换前后对照表”记录每个原始值的类型和转换结果用表格盯着看比空想强一百倍。2.3 数组切片从列表到numpy一步到位切片是Python练习里最多人背了规则却不会用的点。list[1:5]、list[::-1]这些我记在纸上没用要找一批真实的序列来切。比如有一串股票收盘价让你取出最后10天数据把周一到周三的数据筛出来再构造一个顺序反转的新列表属于最基础不过的需求。真正练透切片的关键不是记住“左闭右开”而是多画几张下标图把正索引、负索引、步长的对应关系画在纸上。从列表切片过渡到numpy数组切片会让理解上一个台阶。先安装numpy然后创建一维数组和二维数组试试arr[1:3, ::2]这类写法。二维切片的逻辑其实是从列表切片扩展来的只是多了一个维度。等你能不看文档写出“取矩阵第二行、第三行每两列取一个”的代码时这关就算过了。2.4 定义函数别怕写函数十行就练一个很多新人的练习路径偏题了把函数当成“高级知识”放到最后学结果写到最后都是长长的一坨脚本。函数其实是练基础语法阶段就该大量上手的东西。我的练习建议很简单把你已经写过的那些打印、类型转换、切片操作全部封装成函数。比如写一个filter_price(price_list, threshold)传入价格列表和阈值返回所有超过阈值的价格。这段函数最多十行却能练到参数、循环、条件判断、返回值和调用filter_price([...], 50)的完整流程。函数练习中容易被忽略的是默认参数和可变对象的问题。我不会一开始就讲得很深但会让新人先跑一个实验定义一个append_to_list(item, lst[])连续调用两次看看第二次调用时lst里为什么还残留着上一次的值。这个实验做到位你对“默认参数在定义时就被求值”这个坑会记得特别牢比背十遍Python文档都管用。3. 经典100题的练法顺序、分支、循环、递归的查漏补缺3.1 不要死刷题用题单查水平网上流传的各种“Python经典100编程题”拿来当字典用就好千万别按顺序从第1题刷到第100题那样既枯燥又低效。我做练习的时候会把题单分成三类第一类是最基础的顺序/分支/循环用来排查语法盲区第二类是字符串和数学逻辑题用来练常规算法第三类是递归、搜索这类需要一点思维的题用来主动制造困难。每类题挑5题左右就够了关键在于每题都要想清楚为什么这么写。比如看到题目里出现“水仙花数”你要能反应过来这是“遍历三位数并取出个位十位百位”的综合题。看到“素数判断”应该马上想到range(2, int(n**0.5)1)这个小小的开方优化。这种反应的熟练度才是刷题真正练出来的东西。3.2 一道有味的题李白打酒的可编程版本经典题里有很多藏着诗意或历史梗的“李白打酒”是我特别喜欢拿来讲的一道题。原题大致是李白无事街上走提壶去打酒。遇店加一倍见花喝一斗。三遇店和花喝光壶中酒。试问壶中原有多少酒。这个问题反过来推非常经典最后一次喝光之前壶里应该有1斗如果最后一次操作是“遇店加一倍”那进店前就是半斗如果前一次是“见花喝一斗”那就再倒推一斗。为了练习我们可以把操作序列固定下来比如按“店、店、花、店、花、花”的顺序去计算初始酒量。代码可以写成operations [店, 店, 花, 店, 花, 花] wine 0 for op in reversed(operations): if op 花: wine 1 elif op 店: wine / 2 print(wine)第一眼看上去wine 1和wine / 2好像只是在做数学实际上练的是“倒推思维”和“循环序列处理”。相比直接列方程程序解法能打印出每一步的状态对新手友好得多。这道题还可以变体如果操作顺序不固定要求遍历所有可能的店花排列并筛选出初始酒量为整数的组合那就是一个标准的枚举回溯练习了。3.3 刷题时的三个常见卡点与对策练经典题最打击人的卡点有三个第一个是递归写了一半不知道出口在哪第二个是循环条件写反了导致死循环第三个是边界值没考虑比如循环里访问列表的len(lst)索引越界。每个卡点我都建议用“打印中间变量”的方式解决。就在循环体里临时加一行print(i, current_value)看清每一轮变化比空想“逻辑应该没问题”效率高得多。遇到递归题先别急着写函数体先把终止条件写在第一行。比如写阶乘先写if n 0: return 1剩下的事情会自然很多。遇到死循环检查while后面条件里的变量有没有在循环体里被更新。这些问题写多了就会形成肌肉记忆所以我一再建议新人不要只看“答案代码”要亲手把报错过程走一遍。4. 数据处理型练习numpy、pandas、matplotlib、sklearn怎么下手4.1 装库不是玄学pip安装与常见报错“python安装numpy库的方法”大概是新手问得最多的热搜词之一但很多人卡在装库之前的一个问题不知道自己该用conda还是pip。其实你只要在一个环境里安装即可别混着乱敲。用Anaconda可以在Anaconda Prompt里执行conda install numpy pandas matplotlib scikit-learn如果用的是官方Python则用pip install numpy pandas matplotlib scikit-learn安装过程中最常见的是下载慢和依赖冲突。国内用户习惯用国内镜像源比如在命令后面加-i参数指定清华镜像速度会快很多。依赖冲突的典型场景是“要安装sklearn时结果把pandas版本也改了”这种情况建议直接用虚拟环境单独建一个conda create -n mypractice python3.11然后在里面装库。环境隔离这件事越早学会越好否则后面练不同项目时包版本互相打架非常酸爽。4.2 numpy、DataFrame和结构化数据的练习套路装好库之后练习的重心应该从“语法题”转向“数据题”。numpy练习建议从数组的创建开始np.zeros、np.ones、np.arange、np.random.randn然后练索引和reshape。每天花20分钟把这些方式各写一遍顺手再算个mean、sum。我见过一些把numpy工具函数背得滚瓜烂熟的人但一面对真实数据还是只会用Python自带列表去写循环原因就出在练习时没有刻意用numpy向量化操作代替循环。比如求两组数的逐元素乘积直接用a * b就好别写[i*j for i,j in zip(a,b)]。最后一种写法倒是没错但跑大数据时会慢得离谱。pandas练习主要抓两个对象Series和DataFrame。你可以随便找一张Excel表先用pd.read_excel()读进来再看df.head()、df.info()然后做筛选、排序、分组。数据科学应用里最经常提的“结构化数据”其实就是这种行列规整的表格。练习时可以从df[df[年龄] 30]开始一步步做到df.groupby(城市)[销售额].sum()。这些操作练完再回来看DataFrame的内部存储方式会清楚很多。4.3 画图的横坐标太密集这样一个参数解决很多人练习画图时会被“横坐标太密集”折磨到怀疑人生。原因很简单你给matplotlib传了一堆标签它默认全画出来几百个日期数据挤在同一个窄条图里自然糊成一团。解决这个问题有几种办法我最常用的是两招。第一招旋转标签import matplotlib.pyplot as plt plt.plot(x, y) plt.xticks(rotation45)第二招手动控制刻度间隔。比如每10个点显示一个标签plt.xticks(x[::10], x[::10])如果用的是pandas的df.plot()也可以在DataFrame.plot里传x参数再把xticks设置成df[日期][::10]。练完这两个参数之后你就能明白“画图本质上是绘图库在帮你做轴刻度布局而不是真正理解了你的业务周期”把轴当成自己可控的对象比让库自动猜要靠谱得多。4.4 sklearn的入门练习从准数据到模型一行调用scikit-learn被很多人当成高深的东西其实第一份代码最短只有几行。我会先让新人在已有的DataFrame上做一个最简单的线性回归目标列是y特征列选一两个数值字段from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression X df[[面积]] y df[价格] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) model LinearRegression() model.fit(X_train, y_train) print(model.predict(X_test))这串练习重点不是调参而是理解“训练集/测试集为什么要分开”和“fit/predict这两个阶段在做什么”。很多所谓“深度学习入门”其实第一步都应该从这种几行代码的回归开始。等你能解释train_test_split的random_state为什么固定以及为什么需要它再去看其他算法会轻松很多。5. 爬虫与自动化办公练习实用有边界5.1 爬虫练习项目的定位爬虫是很多人练Python的驱动力但我建议从一开始就建立边界感。练习爬虫用的目标站点优先选择官方提供API的开放平台或者你自己能控制的数据源。别拿不开放数据的公开站点做压力测试这种行为既不稳定也不礼貌搞不好还踩法律红线。我非常不建议把时间花在研究“绕过防护”“批量爆破”这些脚本上不仅毫无练习价值而且大概率把自己练到不适合讲出来。练习爬虫的正确思路是学会requests取数据、BeautifulSoup或parsel解析HTML、json处理接口返回然后加上合适的时间间隔。举个例子抓取一个你自己部署的静态网页页面里有商品名称和价格先解析出列表再把结果存入CSV。这已经涵盖了爬虫的基本功也完全合规。后续可以试试给请求增加header处理超时和重试观察不同页面结构下的解析差异。5.2 自动化办公三件套Excel、Oracle、命令行当面向真实办公场景练习时Python的价值会立刻展现出来。最常见的就是“python写入excel”比如把一轮计算结果导出成报表。用pandas写Excel只要两行df.to_excel(report.xlsx, indexFalse)进一步还可以用ExcelWriter往同一个文件的多个Sheet里写数据新人在练习时可以拿一份现成的Sales表格试一遍。如果数据来自数据库比如公司系统用的Oracle则会遇到“python连接oracle查询数据”的课题。这需要安装cx_Oracle或oracledb并配置数据库连接字符串。我第一次连Oracle时没有装对应版本的Instant Client卡了很久后来发现不用那么麻烦新版oracledb直接有thin模式不需要额外客户端干净很多。基础代码无非是import oracledb conn oracledb.connect(useruser, passwordpass, dsnhost:port/service) cursor conn.cursor() cursor.execute(select * from test_table) rows cursor.fetchall()练这种项目一开始别想着连着公司系统做一堆操作先用本地的sqlite库模拟一遍再对着测试库调通连接安全又有效。还有一个方向是“python连接cmd”其实本质上是用subprocess运行外部命令比如批量重命名文件调用系统命令完成压缩。练习思路是写一个脚本递归扫描某目录下的jpg文件然后调用subprocess.run执行一条压缩命令。这类练习能让你理解Python和操作系统的边界在哪里。5.3 图像文字识别类工具的省资源练习有时候自动化办公会遇到识别图片文字的需求比如扫描版发票、截图里的表格。有人用rapidocr跑起来以后发现CPU占用飙高很厉害这是非常正常的。OCR本身是重度计算在CPU上跑线程数和图片大小都会直接影响资源消耗。我建议练习时先处理小尺寸截图并把图片转成灰度再进OCR流程速度会快很多。另外可以通过设置线程数来限制CPU使用from rapidocr_onnxruntime import RapidOCR engine RapidOCR() result, elapse engine(small.png)如果发现依然很卡可以先把图片用PIL缩放到合适尺寸再传给OCR引擎。不要一上来就往最大最清晰的原始大图上怼那会让你的风扇直接起飞。练习OCR的目标是理解输入输出结构不是压榨硬件性能。6. 别让练习变成看视频我的自查清单与心态建议6.1 每天练习的“小步快跑”清单我总结过一份给新人的每日练习清单用来防止“看视频两小时一行代码没写”的尴尬。内容不复杂每天至少写10行能运行的新代码内容从变量、函数、切片到numpy、DataFrame任选每天至少修复一个自己的报错把报错信息和当时的代码抄到笔记里每三天回顾一次之前的代码试着把同一个功能换不同写法实现。坚持一个月基础语法熟练度会肉眼可见地提升。这份清单看起来简单难的是不要贪多。我曾经见过一个学员一天内从变量练习直接跳到LSTM模型结果什么都看不懂第二天就放弃了。把大目标拆成小步是练习中最反直觉却最有效的一件事。6.2 遇到报错时怎么自己解决“遇到报错就截图问别人”是让练习效果大打折扣的坏习惯。我自己的习惯是这样先把报错文本完整读一遍很多答案就藏在最后一行然后在代码里加print输出关键变量的值确认当前状态如果还是没头绪就把问题缩小到最小复现比如把几十行代码删到能触发报错的最短片段。这一步做完你会经常发现原来根本不是想的那样。这几乎是排查任何问题都通用的方法论。当年我练数组切片时有个问题困扰了很久arr[1, 2]报IndexError后来我把数组形状打印出来才发现是我创建时把轴顺序搞错了。用print(arr.shape)多写一笔比翻思路快得多。这个习惯现在也一直保留着。6.3 不要碰的练习对象最后专门说一点安全边界。练习Python是件好事但有些方向绝对不能碰比如各种外挂辅助脚本、攻击脚本、绕过机制类代码。像搜索引擎里那些“cc攻击源码”“爆破脚本”“微信跳一跳辅助”之类的内容既破坏公平性又可能让自己账号和机器遭殃更严重的是会踩到法律红线。练习的目的是提升理解和创造能力而不是寻找捷径。我见过一些本来基础不错的人误入这些方向最后技术没长进反而留下不少麻烦。老老实实练基本功、做数据、写自动化才是走得最远的路。就我个人经验来说练习Python最好的状态是把它当成每天顺手做的事装好环境敲几行语法跑一段数据做一个自动化小任务看着报错一点点消失。把上面的步骤过一遍你已经比大部分停留在“收藏教程”状态的人往前走了一大截。