
刚开始接到这门课的 Python 作业时我其实有点懵——不是题难而是作为零基础入门的人光是“怎么让 Python 跑起来”就花了我一个晚上。等真正把一整套作业从环境搭建、语法练习、数据处理到最后的综合项目走完回头再看才发现这门作业真正考验的不是某道题的答案而是你有没有把整个 Python 学习的流程完整走一遍。这篇东西就当是我给自己的一次复盘也是写给正在跟同样作业较劲的同学的一份实战参考。不管你是刚开始装 Python还是已经卡在某个画图、导库、连数据库的环节我尽量把动手过程中踩过的坑和摸索出来的路都写明白。1. 作业开始前先把环境这关打通1.1 装哪个版本别稀里糊涂很多同学一上来就随便找了个 Python 版本装结果作业做着做着就发现库装不上或者代码运行效果跟老师讲的不一样。我自己的建议是不要追新也不要守旧。当时我用的是 Python 3.8因为很多教材和第三方库在这个版本上兼容性最稳。如果你的老师或者课程有指定版本那就严格按指定来如果没有直接装 3.10 左右的稳定版本就够用。这里有个容易忽略的细节下载安装包时注意看你的电脑系统是 64 位还是 32 位。现在的 Windows 电脑绝大多数都是 64 位但如果你不小心下了 32 位版本后面安装 numpy、pandas 这类科学计算库时很容易报“不是有效的 Win32 应用程序”之类的问题。官网下载地址就是 python.org进去之后注意找带 “Download” 按钮的界面别点错了。下载完成后一路 Next 基本就装好了但有一个关键勾选项在安装界面底部一定要勾选Add Python to PATH。这个不勾你后续在命令行里用 python 就会特别痛苦我身边至少五个人栽在这里。1.2 环境变量和 cmd 是怎么回事“环境变量”听起来很高大上其实就是告诉系统你在任意目录下敲python这个命令时系统应该去哪里找python.exe这个程序。配好了环境变量你在 cmd 里输入python就能直接进入 Python 交互环境没配好系统会提示“不是内部或外部命令”。如果你安装时忘了勾选 Add Python to PATH可以手动补上。步骤也不复杂右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 在“系统变量”里找到Path→ 编辑 → 新建两条路径一条指向你 Python 的安装根目录一条指向它的Scripts子目录通常在C:\Users\你的用户名\AppData\Local\Programs\Python\Python38\下面。配完之后重新打开一个 cmd 窗口输入python --version如果能看到版本号就说明配置成功了。注意修改完环境变量之后你原本打开着的 cmd 窗口不会自动生效必须重新开一个这一点卡了我好几次还以为自己改错了。1.3 VS Code 配置别再用记事本写代码写作业用什么编辑器我强烈建议直接用VS Code它比 Python 自带的 IDLE 好用太多了。IDLE 做小练习还行但作业一长没有代码高亮、没有自动补全、没有调试功能效率很低。VS Code 装完之后要装一个 Python 扩展插件然后按CtrlShiftP输入Python: Select Interpreter选你刚装好的那个 Python 解释器。这一步很重要不然你在 VS Code 里写代码时它可能默认用的不是同一个 Python导致你明明装好的库运行时却提示ModuleNotFoundError。另外我习惯再装一个 Code Runner 插件写代码时直接右键 Run 一下就能看到输出写作业的时候比较方便。1.4 第三方库装上作业才有得写作业里如果要装 numpy、matplotlib、pandas、scikit-learn 这些库最常用的命令就是pip install numpy pip install matplotlib pip install pandas pip install scikit-learn但有个现实问题默认的 PyPI 源在国外下载速度特别慢甚至经常超时。我的做法是临时指定国内镜像源比如清华源pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple如果你想一劳永逸也可以直接配置全局镜像新建一个pip.ini文件写入对应配置或者直接在命令行里执行pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple还有几个特殊场景顺带提一下。比如pip install opencv-python就是 cv2它是自带了依赖的直接装一般没问题。如果是在 Linux 系统上装 Python 相关的库注意可能需要先装python3-pip、python3-dev之类的系统包。又比如有些库提示“要安装缺失的节点”或者需要额外依赖像 ComfyUI 那种项目会让你先跑一条pip install -u --pre相关的命令这其实是在告诉你它需要预发布版本才能装上去遇到类似提示不要慌仔细看安装信息就能找到下一步。2. 作业中的语法题这样写才稳2.1 定义函数和变量别小看这些基本功作业里最常见的题目就是“定义一个函数实现某某功能”。看着简单但很容易丢分。定义函数的标准格式是这样的def calculate_area(length, width): 计算矩形的面积 :param length: 长度 :param width: 宽度 :return: 面积 area length * width return area几个容易忽略的点函数名要能表达功能不要用abc、fun1这种没有语义的名字。函数内部用了哪些变量作用域要搞清楚。函数内赋值默认是局部变量不影响外部同名变量。return 不写的话函数默认返回 None。定义变量看着更基础但作业里我曾经因为变量名用了list和str这种内置关键字导致后面调用列表和字符串方法时各种报错。后来养成了习惯变量名不要和 Python 内置函数或类型重名不然容易莫名其妙踩雷。2.2 类型转换题注意输入默认是字符串有一类作业题专门练变量类型和类型转换比如让你输入一个数、再输出它的平方。我刚开始写的代码是num input(请输入一个数字) print(num * num)结果运行时直接报错。原因是input()返回的全部是字符串5 * 5是非法操作。正确做法是先转换类型num int(input(请输入一个数字)) print(num * num)Python 常用的类型转换包括int()、float()、str()判断类型则可以用type()或isinstance()。作业里的练习题经常会给你一个变量让你判断它是整型、浮点型、字符串还是布尔型你直接用type()打印出来就行。这里有一个易错点布尔型其实继承自整型isinstance(True, int)的结果是True。如果考试题里考这个很容易懵。2.3 数组切片切的时候要搞清楚边界数组切片是 Python 作业里的常客特别是字符串和列表。最基础也是最关键的语法是[start:stop:step]它是左闭右开的也就是说 start 位置的元素包含在内stop 位置的元素不包含。比如arr [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(arr[2:6]) # 输出 [2, 3, 4, 5] print(arr[:4]) # 输出 [0, 1, 2, 3] print(arr[::2]) # 输出 [0, 2, 4, 6, 8] print(arr[::-1]) # 输出 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]::-1是最经典的倒序写法写作业的时候特别常用。还有一个细节切片操作不会修改原列表它返回一个全新的列表但如果你直接赋值给切片比如arr[2:4] [100, 200]原列表会被修改这是两种不同的机制。2.4 经典编程题李白打酒怎么解“李白打酒”是很多教材里会出现的一道经典编程题题目大概是李白带着一个酒壶遇到酒店就把壶里的酒加一倍遇到花就喝掉一斗最后刚好把酒喝完。让你编程算某一种情况下壶里最初有多少酒。这种题从前往后推比较复杂但倒过来推就很简单。假设最后喝光了0 斗往前逆推如果是“遇花喝一斗”那么前一步就是当前量加一斗如果是“遇店加一倍”那么前一步就是当前量除以 2。def solve(total_store, total_flower): wine 0 # 从后往前模拟 # 这里先给一个简化思路具体顺序需要根据题目要求排列 wine 0 for i in range(total_flower): wine 1 for i in range(total_store): wine / 2 return wine当然实际题目的顺序是穿插的不是先花后店你需要根据题目给的事件序列来逆推。这个题的核心是训练“倒推法”和“模拟法”理解了这两点很多类似的题目都能顺下来。这也是作业里最值得琢磨的几类基础题之一。3. 数据处理和可视化作业的高分分水岭3.1 用 numpy 构建邻接矩阵有一类作业会让你处理图结构的数据比如构建邻接矩阵。邻接矩阵说白了就是用一个二维数组来记录“点和点之间有没有边”。如果有 n 个节点矩阵就是 n×n第 i 行第 j 列的数表示节点 i 到节点 j 是否有边无权图用 0/1 表示有权图可以用权值。用 numpy 来做非常方便import numpy as np # 假设有 5 个节点先初始化为全 0 adj_matrix np.zeros((5, 5), dtypeint) # 添加一条边节点 0 到节点 1 adj_matrix[0][1] 1 # 如果是无向图还要对称加一条 adj_matrix[1][0] 1 print(adj_matrix)这里有一个细节numpy 数组的索引是从 0 开始的而且它是左闭右开。如果你用 Python 原生列表做二维数组初始化时要注意不能用[[0] * n] * n这样生成的每一行都是同一个对象的引用修改一个元素会导致整列都被修改。我当时就被这个坑折腾了半天最后用 numpy 直接解决省心很多。另外如果作业要求你从文件里读数据构建邻接矩阵可以用pd.read_csv或者open()读文本之后再切分、填表稍微复杂但逻辑很清晰。3.2 结构化数据用 pandas写 Excel 也很方便作业里如果给你一份表格数据比如 CSV 或者 Excel 文件要求筛选、统计、排序直接用 pandas 简直是降维打击。import pandas as pd df pd.read_csv(data.csv) print(df.head()) # 查看前 5 行 print(df.info()) # 查看列名和数据类型 print(df[column].mean()) # 算平均值写回 Excel 也特别简单df_filtered df[df[score] 60] df_filtered.to_excel(filtered.xlsx, indexFalse)注意to_excel依赖 openpyxl 库如果没装会报错。执行一下pip install openpyxl就好。pandas 处理结构化数据的核心优势是它可以像一个迷你数据库一样对表格做各种操作。我写作业时最常用的三个操作是按条件筛选行、按列排序、按组求聚合值。这三个能满足大部分题目要求。3.3 matplotlib 画图横坐标太密集怎么办画图是很多作业最后一步的要求也是最容易出“看起来很不专业”效果的地方。有一类特别常见的问题横坐标是日期或者 100 多个标签全挤在一起根本看不清。如果是日期类型最简单的做法是让 matplotlib 自动旋转刻度标签import matplotlib.pyplot as plt plt.plot(x, y) plt.gcf().autofmt_xdate() # 自动旋转日期刻度 plt.show()如果是普通字符串坐标可以通过控制刻度间隔来让它们稀疏一点import matplotlib.pyplot as plt import numpy as np x [fitem_{i} for i in range(50)] y np.random.rand(50) plt.plot(x, y) plt.xticks(ticksrange(0, 50, 5), rotation45) plt.tight_layout() plt.show()plt.xticks(ticksrange(0, 50, 5))的意思就是横坐标只显示第 0、5、10……个标签这样就不会挤成一团。另一个技巧是用MaxNLocator来控制最多显示多少个刻度from matplotlib.ticker import MaxNLocator ax plt.gca() ax.xaxis.set_major_locator(MaxNLocator(nbins10)) plt.show()经验之谈画图题最拉分的地方不是“画不画得出来”而是“别人看不清的情况下你还硬生生把图交上去了”。适当旋转、间隔采样、调整画布尺寸都是低成本高收益的操作。3.4 连接 Oracle 查询数据这类作业怎么处理有些进阶一点的作业会让你从数据库取数比如连接 Oracle 查询数据。这个在入门阶段比较少见但如果有一般会用到cx_Oracle或者新版推荐的python-oracledb库。import oracledb conn oracledb.connect(userusername, passwordpassword, dsnhost:port/service_name) cursor conn.cursor() cursor.execute(SELECT * FROM some_table WHERE id :id, {id: 1}) rows cursor.fetchall() for row in rows: print(row) conn.close()核心套路就是三步建立连接、创建游标、执行 SQL。很多同学第一次接触会觉得数据库很高深其实在作业场景下只要会用连接串连上、查数据、关闭连接就够了。顺带提一句如果作业里说“连接公司系统自动拉表”本质上也差不多只是可能走的是 API 接口而不是数据库直连。那时候就要用requests库请求接口、解析 JSON 返回结果原理类似但要注意接口鉴权和频率限制。4. 常见报错和排查技巧收藏一份少走弯路4.1 pip 安装库失败的通用排查装库失败是最常见的报错场景几乎每个人都会遇到。我遇到的失败原因主要分三类网络超时。解决办法是换源前面提到过清华镜像还可以用阿里云镜像。权限不足。Windows 上有时提示 “Permission denied”可以加pip install --user 包名试试。Python 版本不兼容。有的库只支持特定 Python 版本比如一些库在 Python 3.12 上还没有对应 wheel 包。这时候要么换库版本要么换 Python 版本。还有个比较复杂的情况本来想装cv2但别人告诉你应该申opencv-python。这是同一个东西的两种名字import cv2才是在代码里导入的关键。类似这种别名库还有PIL对应Pillow、sklearn对应scikit-learn遇到导入名和包名不一致时搜索引擎能帮你节省大量时间。4.2 模块找不到先确认解释器是不是同一个ModuleNotFoundError: No module named xxx这个报错90% 的情况不是因为库没装而是因为你装库用的 Python 和你运行代码用的 Python 不是同一个。我犯过最典型的错误就是在 cmd 里执行了pip install pandas然后在 VS Code 里居然还是报错。后来发现自己 VS Code 右下角选中的是另一个解释器。所以排查这个问题的顺序是在 VS Code 里按CtrlShiftP重新选择解释器选你装有这个库的解释器路径。在代码里运行import sys; print(sys.executable)会显示当前使用的 Python 路径。在 cmd 里运行同一个 Python 路径下的pip install保证两边完全对应。一个更省心的方案是使用虚拟环境在项目目录下创建属于自己的独立环境这样以后不管怎么折腾系统 Python 都不影响作业。4.3 程序跑得慢怎么定位瓶颈有些作业如果涉及图像处理、OCR 或者大文件读取你可能会发现程序特别卡CPU 占用率直接拉满。比如在 Python 里用 RapidOCR默认会开启多线程做文字识别结果小笔记本都快跑冒烟了也没见速度有多快。定位瓶颈的一般做法是先用time模块粗略测量每个步骤耗时再用cProfile跑一次脚本看每个函数的累计耗时。import time start time.time() # 某个耗时操作 end time.time() print(f耗时: {end - start:.2f}秒)如果是 OCR 这类偏计算密集型的库可以限制线程数或者降低图片解析分辨率如果是循环里重复调用了特别耗时的函数考虑缓存结果或者换用 numpy 向量化写法一般能快上好几倍。4.4 其他容易踩的坑中文字符编码问题读取文本文件时出现乱码大概率是编码格式不对用open(file.txt, encodingutf-8)试试。安装目录名带空格有些人用户名或者路径含中文或空格偶尔会导致库编译出问题尽量让 Python 环境路径全是英文。重复安装多版本 Python机器上有 3.8、3.10、3.11 多个版本容易互相干扰。用python -m pip而不是单独用pip可以避免装错地方。5. 作业做完之后怎么往下走5.1 基础作业如何延伸成“小项目”很多同学完成作业之后就放下了我建议你可以试着把作业里的某个小题扩展成一个完整的小项目。比如原本只是让你画一条 sin 曲线你可以把它扩展成“读取一份 Excel 数据分析趋势画多张子图并导出 PDF 报告”。整体思路不变但每多走一步你就多掌握一个真实开发里的常用技能。爬虫、量化、科学计算是三个非常常见的延伸方向。爬虫可以用requests加上BeautifulSoup写一个抓取网页信息的脚本量化方向可以先用akshare拉行情数据再用pandas做简单的均线策略回测科学计算则可以把 scipy 和 matplotlib 配合起来做拟合与分析。这些方向看上去很复杂但它们的底座恰恰就是你在作业里练习过的那些基本数据类型、函数、流程控制和简单计算。5.2 兴趣方向的合规提醒学习 Python 的过程中你可能看到过类似“游戏辅助”“自动爆破”“爬取 XXX 数据”的内容。我的建议是兴趣可以理解但一定要合规。比如游戏辅助脚本尤其是针对在线游戏做自动化操作很可能违反用户协议而且对个人技术成长也没有太大帮助网络测试类的脚本只能在授权靶场里练习任何未经授权对真实系统测试都是越界行为爬虫也要尊重目标网站的协议和数据安全边界。Python 本身是一个工具你用它去做什么决定了它能带给你什么。把精力放在正经的项目上学到的能力是长期积累的碰那些灰色地带反而容易给自己挖坑。这一点希望刚开始学 Python 的同学多留个心。5.3 Python 和 Java 怎么选这个问题几乎每个初学者都会纠结。以我自己的体会来说Python 的优势在于上手快、语法简洁、生态集中在数据分析、机器学习和脚本自动化Java 的优势在于强类型、工程化成熟大型后端系统里应用广泛。如果你写作业或者搞数据分析Python 基本是最舒服的如果你以后想做大型企业级业务系统那 Java 的学习曲线值得现在就开始爬。不用把太多精力花在纠结语言好不好、有没有前途上。作业阶段能用当前学的语言把事情做出来并且理解清楚原理就已经很好了。语言本身是会变的思维方式才是通用的。如果学完基础作业还想保持手感可以去刷一刷“Python 经典 100 编程题”每天两到三道坚持一个月很多语法和思路就内化了。再回头看看当初让你头疼的题目大概率会发现自己已经能在十分钟内写出来。5.4 给你的一个实操小建议写作业的时候最好从第一行就开始写注释哪怕只是“这步做了啥”这种简单的描述。我之前觉得写注释浪费时间但有一次隔了三天回过头改一个长函数看着满屏没有注释的代码根本不敢动生怕改坏哪里。后来养成习惯关键逻辑写注释引起坑的地方写警示整个作业做完之后再统一整理一遍代码格式。这不仅能让你自己回头看时轻松不少有的老师还会看代码风格注释规范经常是加分项。另一个建议是用文件来管理你的作业代码不要一个文件夹放几十个无编号的.py文件。按“作业编号_题目名称_版本”这样命名比如hw2_guess_number_v2.py不仅自己好找后续扩展修改也方便。写在最后回头来看这份 Python 作业真正教会我的不是哪道题的答案而是从零开始搭建环境、查找资料、调试报错、整理代码的完整学习链路。这些东西是课堂上不太会一步一步教你的只能靠自己在作业里一点点磨出来。如果你现在正被某个报错卡得焦头烂额别急着怀疑自己先喝口水把报错信息复制到搜索引擎里八成能直接找到答案——写代码这件事本来就是一个不断“踩坑—查原因—解决”的过程。希望你也能从这门作业里拿到属于自己的那份收获。