Python第三次作业怎么破?从环境配置到成绩统计代码全解析 1. 第三次作业为什么是很多人的第一道坎第三次作业在整门 Python 入门课里的位置大概相当于刚学会踩油门就上了城市快速路。很多人 python 安装、vscode python 环境配置都做完了前两次作业也跑得通但到了第三次作业题目开始要求把变量、函数、文件读写串成一个完整程序于是突然卡住代码能写但不知道从哪下手能跑但一换数据就报错能出结果但离老师要求还差一点。这篇不是让你抄答案而是把第三次作业背后真正要练的东西拆开讲清楚。我见过不少学员把作业写完当成目标结果交上去被扣分扣得莫名其妙。其实第三次作业在绝大多数课程里都是一个分水岭前两次考的是你知不知道这个语法第三次考的是你能不能把语法组织成程序。后者才是编程能力真正的起点。所以不管你这周的作业是学生成绩统计、购物车结算还是猜数字游戏考点基本都是同一批东西。1.1 从看得懂到写得对的跳跃第一次作业通常是变量、基本数据类型、print 输出第二次可能加 if-else 和 for 循环这些都属于单点语法练习。到了第三次作业老师默认你已经掌握了两件事一是 Python 的基础语法能读懂了二是遇到报错至少能看懂 Traceback 指向哪一行。然后他才会出综合题。综合题和你以前做过的题最大的区别是它不再告诉你这里该用 if而是要你自己判断。拿最常见的成绩统计来讲题目里可能同时包含读文件、列表、字典、函数、排序、格式化输出。如果你只是把语法书上的例子拼在一起很快就会遇到一个问题数据一多变量名就乱逻辑就缠在一起。这不是你笨而是缺少一个叫程序结构的东西。所以我每次都会和学生说一句话第三次作业的验收标准不是跑出结果而是换一组数据甚至换一个文件你的代码还能不能稳定跑通。一个函数只干一件事、用有语义的变量名、把重复逻辑提取出来这些习惯在第三次作业里开始变得重要。这时候养成的习惯后面写爬虫、做数据分析、写量化策略代码都会一直跟着你。1.2 一个足够典型的第三次作业题目长什么样由于每个人拿到的具体题目不同我以最常见的学生成绩统计为例给出一个非常接近真实作业的需求描述。你可以对照自己手上的题目看大部分核心点都能对应上。编写一个 Python 程序从 grades.csv 文件读取学生姓名、学号、Python、数学、英语三门课成绩。计算每位学生的总分和平均分。统计每门课程的平均分、最高分、最低分。按总分从高到低排序输出前 10 名学生。将统计结果写入 result.txt。可选加分项用 matplotlib 画出各科平均分柱状图。这个题目覆盖了第三次作业最常见的所有考点CSV 文件读取、字符串转数值、列表和字典组合、函数封装、排序、文件写入、数据可视化。后面所有内容我都会围绕这个题目展开就算你的作业是购物车或猜数字里面的环境配置、排错思路、提交检查清单一样能用。2. 写作业前先把 Python 环境理顺这一步最容易被低估很多人的代码写不完不是不会写而是环境乱七八糟。第三次作业开始涉及第三方库和文件读写环境问题会第一次大规模暴露。见过太多同学在群里发我这代码昨天还能跑今天突然不行了最后发现是打开了两个不同的 Python 环境。2.1 Python 装好不等于能用环境变量和 PATH 的作用Windows 上装 Python 的时候安装界面第一屏有一个很容易被忽略的选项Add Python to PATH。如果没勾你打开命令行输入 python系统只会提示不是内部或外部命令。这不是 Python 没装好而是系统不知道去哪里找 python.exe。PATH 环境变量的作用可以理解为一份系统查找程序的目录清单。你输入 python操作系统会按清单里的目录一个个找找到就执行。所以环境变量配置的核心就是把 Python 安装目录加进这份清单。具体路径一般是C:\Users\你的用户名\AppData\Local\Programs\Python\Python312\ C:\Users\你的用户名\AppData\Local\Programs\Python\Python312\Scripts\不建议手动去注册表或者 C 盘里乱翻最稳的方法是重装一遍 Python安装时把 Add Python to PATH 勾上。装完后在命令行输入python --version如果能输出版本号说明环境变量没问题。如果你的电脑里同时装了多个 Python 版本建议用官方自带的 py 启动器来管理。在命令行输入py -0p可以列出当前所有已安装的 Python 版本用py -3.11 script.py可以指定用某个版本运行脚本这个技巧在作业项目里非常实用。2.2 虚拟环境别把全局环境搞成一锅粥第三次作业一般不会强制要求用虚拟环境但如果你开始装第三方库了我强烈建议从现在开始就养成用虚拟环境的习惯。虚拟环境可以理解成给你每个项目单独开一个小房间房间里的 Python 版本和已安装的库互不干扰。否则你很容易遇到为了做 A 作业装了一个旧版本 pandas结果 B 作业需要的新版本功能全都不见了最后只能重装 Python 收场。在项目目录下打开终端执行python -m venv .venv然后激活环境。Windows 是.venv\Scripts\activatemacOS 或 Linux 是source .venv/bin/activate激活后命令行前面会出现(.venv)标记这时候再用 pip 安装的库都只会装进这个虚拟环境不会污染全局。后面你再跑pip list看到的也是这个环境里干净清爽的库列表。很多从网上下载的完整项目都会附带一个 requirements.txt里面写了项目需要的所有依赖安装命令就是pip install -r requirements.txt如果你经常看到请安装缺失的包以使用此工作流这类提示本质上就是这个环境里缺依赖不是代码逻辑坏了。根据提示把缺失的包用 pip 装进当前环境问题就解决了。2.3 编辑器选 VSCode 还是 PyCharm我建议这样选这个问题几乎每周都会被问。PyCharm 功能全调试器、虚拟环境管理、代码补全都是开箱即用适合第一次接触编程、不习惯折腾的人。VSCode 启动快、界面轻、插件生态好但 Python 环境配置需要手动选择解释器前期会多花一点时间。如果你已经在用 VSCode最重要的一个步骤是按 CtrlShiftP输入 Python: Select Interpreter然后选择你自己项目里的 .venv 解释器。这一步不设置好你会在 VSCode 里按运行终端却提示找不到 pandas。原因就是 VSCode 默认用了系统 Python而不是虚拟环境里的 Python。我的建议是作业阶段用哪个都无所谓关键是把解释器到底选的是哪一个这个问题搞清楚。你用鼠标点运行的每一段代码最终都有一个具体的 python.exe 在跑。遇到我这有 numpy运行却说没有的问题第一步永远不是重装而是检查终端里执行的是哪个环境的 Python。3. 用学生成绩统计这个题目把第三次作业的代码思路完整过一遍现在进入正题。我不打算直接甩一大段完整代码那样你复制完还是不会。更好的方式是跟着思路走一遍知道这段代码为什么这么写然后再自己动手敲。3.1 拿到题目后先写伪代码不要直接打开编辑器我教过的学生里写作业最快出问题的通常是一上来就打开 VSCode 开始敲代码的人。他们敲着敲着发现逻辑对不上又要删掉重来来回折腾两小时。正确做法是先拿纸或者在代码顶部用注释把伪代码写出来。伪代码不用管语法只管流程1. 读取 grades.csv 2. 把每一行转成一条记录存到列表里 3. 对每条记录计算总分和平均分 4. 用总分排序 5. 输出前 10 名到 result.txt 6. 分别计算三门课的平均分、最高分、最低分写到这里你已经能把一个大问题拆成六个小问题了。每个小问题分别实现最后在 main 函数里按顺序调用这就是编程里的分而治之。你不需要一开始就会设计大型系统但第三次作业的代码量已经足够让不用函数、全写在一起的写法失控。3.2 核心代码分段实现读文件、算成绩、排排序先写文件读取。在处理 CSV 时我习惯用 Python 自带的 csv 模块不引第三方库也能完成作业逻辑更清晰import csv from pathlib import Path DATA_FILE Path(grades.csv) RESULT_FILE Path(result.txt) def read_grades(path): records [] with path.open(r, encodingutf-8, newline) as f: reader csv.DictReader(f) for row in reader: records.append({ name: row[name], student_id: row[student_id], python: float(row[python]), math: float(row[math]), english: float(row[english]), }) return records这里有几个细节值得你注意。第一用float()把字符串转成浮点数这就是 Python 类型转换最常见的应用场景。第二csv.DictReader会把每一行变成一个字典key 是表头这样后面取数据时写record[math]比row[1]可读性好得多。第三Path对象来自 pathlib 库它能正确处理 Windows 和 macOS 的路径差异作业里尽量别手写带盘符的绝对路径。然后是统计函数。一个函数只做一件事这是在第三次作业里最值得刻意练习的规范def student_total(record): return record[python] record[math] record[english] def student_average(record): return student_total(record) / 3 def course_stats(records, course): scores [r[course] for r in records] return max(scores), min(scores), sum(scores) / len(scores)这段代码里的scores [r[course] for r in records]是列表推导式它的意思是从 records 里把每一行的指定课程成绩取出来组成一个新列表。你可以用普通 for 循环实现同样的效果但列表推导式更简洁而且能体现你对 Python 风格的掌握。注意course_stats返回的是一个元组调用时可以直接用max_score, min_score, avg_score course_stats(records, math)解包这是 Python 里很常用的写法。排序可以这样写records.sort(keystudent_total, reverseTrue)sort的 key 参数接收一个函数意思是不直接比较字典而是用student_total算出来的总分作为排序依据。这里不需要写复杂的比较器Python 已经替你处理好了。3.3 让代码更专业函数拆分、类型转换、装饰器如果你希望作业在老师的评分标准里有设计感而不是能跑就行可以再往上走一步。首先是函数入口。用main()把所有调用组织起来def main(): records read_grades(DATA_FILE) records.sort(keystudent_total, reverseTrue) with RESULT_FILE.open(w, encodingutf-8) as f: f.write(f{排名:4}{姓名:8}{学号:12}{总分:8}{平均分:8}\n) for i, record in enumerate(records[:10], 1): f.write( f{i:4}{record[name]:8}{record[student_id]:12} f{student_total(record):8.1f}{student_average(record):8.1f}\n ) if __name__ __main__: main()这里的f{排名:4}是格式化输出4表示左对齐并占 4 个字符宽度。用这种方式写出来的文本表格在记事本里打开也是对齐的。装饰器这个知识点如果你已经在课上接触过可以加一个简单的函数计时装饰器用来统计每个函数的运行时间import time def time_it(func): def wrapper(*args, **kwargs): start time.time() result func(*args, **kwargs) print(f{func.__name__} 耗时 {time.time() - start:.4f}s) return result return wrapper然后在可能较慢的函数上加上time_it。不过我要提醒你装饰器在这个作业里是锦上添花不是必选项。如果老师没教过你硬写一个装饰器还要解释半天反而容易在答辩时露怯。真正的加分项是把函数拆得清楚、变量命名合理、注释能说明意图。4. 文件读写、数据分析与可视化作业里最容易丢分的三个细节第三次作业的题目一旦涉及到成绩统计、销售分析、天气数据就必然会碰到文件读写和第三方库。这一部分理论不多但坑特别密集而且是老师扣分的高发区。4.1 文件编码和路径问题为什么 CtrlC 的代码经常崩很多人的代码在老师电脑上跑得好好的回到自己电脑直接报UnicodeDecodeError。绝大多数情况下是文件编码不一致。CSV 文件默认可能是 UTF-8也可能是 GBK。Excel 另存的 CSV 在 Windows 上经常是 GBK而你用 Python 打开时默认按 UTF-8 解码于是报错。最简单的解决办法是在 open 时明确指定编码with path.open(r, encodingutf-8) as f: ...如果改成 utf-8 仍然报错就把 encoding 换成 gbk 试试。还有一种更粗暴但能应付作业的方式是encodingutf-8, errorsignore它会忽略无法解码的字符但我不建议在正式作业里用因为你可能因此丢掉部分数据。路径问题同样常见。很多人喜欢写C:/Users/xxx/Desktop/作业/grades.csv结果作业提交到教室电脑上路径就失效了。最好把数据文件和 .py 文件放在同一个目录然后用相对路径grades.csv或者用Path(__file__).parent定位脚本所在目录。使用 pathlib 之后跨平台踩坑的概率会小很多。4.2 pandas、numpy 和 matplotlib 的最小可用组合如果你要处理的数据量不大纯 Python 完全足够。但老师如果点名要求用 pandas 做统计或者用 matplotlib 画图那就必须装第三方包了。这个组合非常固定pip install numpy pandas matplotlibpandas 读取 CSV 可以一句话搞定import pandas as pd df pd.read_csv(grades.csv, encodingutf-8) print(df.head())如果只看第三次作业不需要把 pandas 学得多深。你只需要掌握三件事pd.read_csv读文件、df[列名]取一列、df.groupby(班级)[成绩].mean()做分组统计。顺带一提很多人会搜python tip.groupby()属于哪个库答案是 pandas 和 itertools 里都有groupby但作用完全不同。你在 pandas 的 DataFrame 上用groupby是因为你想按某个维度分组聚合只有在处理普通可迭代对象时才可能用到itertools.groupby。作业里如果提到分组统计默认用 pandas 的那个。matplotlib 画图的核心代码也很短import matplotlib.pyplot as plt courses [python, math, english] averages [df[course].mean() for course in courses] plt.bar(courses, averages) plt.title(各科平均分) plt.ylabel(分数) plt.show()画图是加分项不需要精美只要坐标轴标签、标题别写错就能拿分。但要注意在部分中文系统上matplotlib 默认字体不支持中文画出来的图会出现方块字。临时解决办法是加上plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False这是我在作业里见过最多的一个翻车现场图出来了但标题是乱码丢掉一半分数非常可惜。4.3 遇到 No module named xxx 不要急着重装 PythonModuleNotFoundError: No module named numpy可能是第三次作业里最常见的一条报错。很多人看到这个第一反应是我 Python 坏了然后重装 Python结果问题依旧。其实这句话翻译过来就是当前正在运行的 Python 环境里找不到 numpy 这个库。解决方式是在对应的环境里安装它python -m pip install numpy注意我推荐用python -m pip而不是直接pip install。因为当电脑里有多个 Python 版本时pip可能指向的是另一个环境而python -m pip可以确保给当前正在使用的这个 Python 安装包。如果项目是用虚拟环境跑的必须先把虚拟环境激活再执行安装命令。从网上下载别人项目时如果项目说明里写了请安装缺失的包以使用此工作流不要一个个手动装先看有没有 requirements.txt有就直接pip install -r requirements.txt如果只是缺一两个包按报错提示安装就行。这个思路不只适用于作业以后你接触爬虫、数据处理、后端开发都会反复遇到。5. 交作业前按这个清单自查能少扣很多印象分代码跑通只是及格线真正决定分数的是细节。每年批改作业我都会遇到同样的几个问题变量名奇怪、输出格式和题目要求不一样、没考虑空文件。这些不是能力问题是检查习惯问题。5.1 命名、注释、输出格式阅卷老师第一眼看什么老师打开你的 .py 文件时先看到的不是你写了多复杂的算法而是代码长什么样。文件名用homework3.py这种原名就别交了至少改成和题目相关的名字比如grade_statistics.py。变量名也是一样a、b、c这种除非是临时循环变量否则尽量别用。data、records、student_id这类名字一眼就能让人看懂维护成本低很多。注释要写为什么而不是是什么。比如# 按总分降序排序如果总分相同保持不变 records.sort(keystudent_total, reverseTrue)这种注释有价值。而下面这种注释基本是噪音# 定义一个变量 x 5输出格式是最容易被忽视的。老师如果要求输出姓名张三总分285.0你就不要输出成张三 285。自动批改程序尤其严格多一个空格、少一个冒号都可能导致判错。交作业前把题目要求里的输出样例复制出来逐字对照自己程序的输出这是最笨也最有效的方法。5.2 边界情况和异常处理空数据、缺字段、除零第三次作业开始老师会故意用一些边界数据来测试你的程序健壮性。比如 grades.csv 是个空文件或者某一行缺少成绩又或者某个学生的成绩是 0。如果代码一遇到这些就崩溃分数直接受影响。一个简单的思路是在读取每一行数据后先检查字段是否存在再检查分数是否能转成数字。用 try-except 包住转换逻辑try: score float(row[python]) except (KeyError, ValueError): continueKeyError对应字典里没有这个 keyValueError对应内容不是合法数字。这样遇到脏数据时程序会跳过这一行继续读而不是直接中断。另一个容易被踩的是除零如果course_stats函数里 records 为空len(scores)就是 0sum(scores) / len(scores)就会抛ZeroDivisionError。处理办法是提前判断if not scores: return 0.0, 0.0, 0.0对作业来说可以写一个相对保守的版本数据为空时输出暂无数据而不是让程序崩溃。这种细节在答辩时很容易成为加分点因为它说明你想到了别人没想到的情况。5.3 加分项用 PyInstaller 把作业打包成 exe如果你的老师要求演示程序或者你想在小组里让同学直接双击就能跑可以试一下把 .py 打包成 exe。PyInstaller 是这里面使用最多的工具安装和打包命令都很简单pip install pyinstaller pyinstaller -F grade_statistics.py-F表示打包成单个 exe 文件。打包完成后在 dist 目录里可以找到生成的程序。不过有两个坑要提醒你第一如果你在代码里用了相对路径读取 grades.csv打包成 exe 后它运行的目录可能和你双击 exe 的目录不一致。最简单的方式是让代码在启动时确定当前目录import sys from pathlib import Path base_dir Path(sys.argv[0]).parent但这里在不同打包方式下会有差异所以如果只是普通作业我更建议你把 exe 和 grades.csv 放在同一个文件夹里双击前先看代码里用的是相对路径还是绝对路径。第二PyInstaller 打包出来的 exe 文件很大纯 Python 脚本也可能有几十兆而且第一次运行时有些杀毒软件会误报。这只是打包工具的常见特性不代表代码有问题。老师一般不会要求打包这个技能更适合你以后做个小工具分享给别人时使用。6. 第三次作业之后想继续进阶可以往这几个方向走作业写完不代表这门课结束。第三次作业之后你会接触到更复杂的数据结构、函数式编程、面向对象、文件项目组织这些内容才是真正把 Python 用起来的地方。6.1 100 道基础题库怎么刷才不白刷网上很多资源会标着python 基础题库 100 题及答案很多人下载后从第一题按顺序做到最后做完就忘这其实是最低效的刷题方式。我的建议是把题目分成三类纯语法题、逻辑题、应用题。纯语法题做十道就够了比如判断素数、反转字符串、统计字符出现次数这些都是同一个套路。逻辑题比如李白打酒这种递推题值得多花时间因为它训练的是把文字描述转化成循环和变量的能力。应用题比如读文件做统计、模拟 ATM 取款才是和第三次作业最接近的题目。李白打酒这道题可以说是非常经典的逆向递推题。题目大意是李白提着酒壶遇店加一倍遇花喝一斗三遇店和花之后酒喝光求原来壶中有多少酒。顺推很绕逆推就很简单从最后酒为 0 开始每往前推一次先加回喝掉的一斗再除以 2。wine 0 for _ in range(3): wine 1 wine / 2 print(wine)答案是 0.875 斗。这种题目对第三次作业阶段的你来说比强行去背装饰器和生成器有价值得多。6.2 爬虫、API 调用、量化策略和 Python 作业的真实距离很多人在学 Python 入门时脑子里想的都是学会之后我要写爬虫我要做数据分析我要写量化交易策略代码。但问题是这些方向全部建立在同一个能力上把杂乱的数据整理成程序能处理的结构。第三次作业里的 CSV 读取和统计实际上就是迷你版的数据分析。爬虫的核心流程是请求网页、解析 HTML、提取数据这里面用到的 Python 语法不过就是 requests、BeautifulSoup、字典、列表、循环。调用一个 API比如讯飞星火这类大模型接口本质就是构造一个 POST 请求把参数转成 JSON 发给服务器再把返回的 JSON 解析出来。量化交易策略代码看起来高端但如果把门槛拉低一点很多策略的第一步也是读历史行情数据、算均线、按条件筛选这些和你在作业里用 pandas 算平均分没有本质区别。所以不要把进阶想得太玄。第三次作业是你第一次完整地经历读取数据 - 处理数据 - 输出结果这个过程把这个过程练熟后面任何一个方向再往里走都会顺很多。等你学到 SQLAlchemy、FastAPI、Django 这些后端框架时你会发现最难的不是框架本身而是能不能把一份数据从文件里干净地读出来再按业务逻辑整理好。6.3 一个让我很受用的学习习惯先读报错再查资料最后分享一个我自己的习惯。遇到程序报错时第一反应不是把报错复制到搜索引擎而是先读一遍报错信息。Python 的报错非常友好它会明确告诉你错误类型、错误发生的位置以及是哪一行代码引起的。你只需要找出那行代码然后问自己三个问题这个变量存不存在这个数据的类型是不是我以为的那个这个函数有没有被导入大部分第三次作业的报错都是这三个问题之一。比如TypeError: unsupported operand type(s) for : int and str意思是有人在整数和字符串之间用了加号那你去检查是不是漏了int()或float()转换。比如AttributeError: NoneType object has no attribute append往往是你在一个空值上调用了 append。读报错的能力比记语法更值得培养。如果你能在第三次作业阶段把这个习惯养成后面写 Python 会轻松很多。反正我后来见过的所有优秀开发者没有一个是不看报错瞎猜的。都是先看报错再定位代码最后才去查资料。这个顺序对了学习的节奏就对了。