Python第一次作业:从安装到画图的完整过关记录
前几天我把自己第一次写Python作业的全过程翻了出来——从装环境的兵荒马乱,到能画出第一张图表、写出第一个Excel的兴奋,中间踩了无数个坑。现在回头看,那些坑基本都是每个新手都会掉进去的,与其让公众号文章把它包装成"轻松上手",不如我把真实的曲折过程摊开讲。这篇就写给同样刚开始学Python、准备交第一份作业的人,内容包括作业思路怎么拆解、环境怎么搭、代码怎么写、报了错怎么查,全程可以照抄着走。
1. 作业拿到手之后,先别急着敲代码
1.1 我从"打开IDE就写"变成"先拆需求"的经历
很多第一次写作业的朋友,包括当时的我,有个通病:题目刚看完,就急着打开编辑器开始敲print。结果写了大半天,程序跑起来跟题目要求完全不是一回事。其实不管是学校的课后作业,还是网课结课项目,拿到的题目里面藏着好几层要求,你第一眼看到的往往只是最表面的那层。
我那次作业的题目长这样(我凭记忆概括一下):
给定一份CSV格式的销售数据(包含日期、产品名称、销量、单价四列),要求用Python完成:读取数据、统计每个产品的总销售额、按日期画出总销售额的折线图、把统计结果写入一个新的Excel文件。
看着挺简单对吧?但拆开来看,这题其实考了五个核心能力点:
- 文件读取:CSV本质是纯文本逗号分隔文件,你要会打开它、逐行解析它,或者直接用csv模块、pandas库;
- 数据分组与聚合:一行一行读出来的裸数据,不会自己变成"按产品分类的总销售额",你要想清楚用什么结构去凑数,字典最合适;
- 计算逻辑:单个产品的总销售额 = 销量 × 单价,再按产品名累加;
- 数据可视化:matplotlib画折线图,这一步还会遇到中文字体显示、横坐标太密集之类的问题;
- 结果导出:把统计结果写进Excel——可以用pandas的to_excel,也可以用openpyxl直接操作单元格。
如果你拿到题目直接动手,做到第二第三步就会卡住。我当时的建议是:拿一张纸,把"输入是什么、中间要做什么处理、输出是什么"三行写清楚,再动手。这不是浪费时间,是在帮你把错误提前扼杀掉。
1.2 环境搭建最省心的路径
Python环境的坑,我在热搜里看到"python安装教程"常年挂着,说明每天都有无数新人在装Python这步翻车。其实装Python本身没有难度,问题都出在"你装完之后不知道自己装到了哪里、怎么用"。
我的建议很简单:去Python官网(python.org)下载对应你系统的安装包——Windows用户注意勾选安装第一步页面下方的"Add Python to PATH",这是绝大多数新人后期在cmd里输python报"不是内部或外部命令"的根本原因。macOS用户直接用官方dmg安装即可,Linux用户多半系统自带或者用包管理器一条命令装好。
装好之后验证一下,打开命令行工具(Windows按Win+R输入cmd,macOS打开终端):
python --version能显示Python版本号,说明安装成功。如果提示找不到命令,多半是PATH问题,重装时勾上那个选项,或者手动把Python安装路径加进环境变量。
关于IDE,第一次作业用IDLE(Python自带的那个简陋编辑器)也能写完,但体验很差。我建议直接上VS Code,配合Python扩展,写代码有自动补全、报错红色波浪线,对新手友好得多。VSCode里按Ctrl+Shift+P,输入"Python: Select Interpreter",选到你装的Python版本,就算配置好了。
2. 装第三方库的三个拦路虎:pip、网络和镜像源
2.1 pip install总是失败,问题多半不在你
写完第一版代码,天真地去运行,结果第一句"import matplotlib"就报ModuleNotFoundError: No module named 'matplotlib'。那一刻我才意识到:Python解释器本身只有标准库,画图、处理Excel这些功能要用别人写好的第三方库,得先安装。
安装库的命令全世界都一样:
pip install matplotlib pip install pandas pip install openpyxl但问题是,很多新人在这一步会遇到"网络超时"、下载速度只有几KB/s的情况。这个问题的本质是pip默认去国外官方源下载包,而国内直连速度感人。解决办法是换成国内镜像源,我用的是清华源,临时指定也可以:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib想让以后所有安装都默认走镜像,执行一次配置命令:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple我建议新人在一开始就把这条路配好,省得每次装库都等半天。
2.2 装库成功但import报错的诡异情况
还有个我踩过、后来帮不少同学解决过的坑:pip install明明显示Successfully installed,代码里import照样报错找不到模块。深层原因是你的电脑里可能同时存在多个Python环境——装库的pip属于环境A,而你VSCode选中的解释器是环境B。
排查方法很简单,在命令行里分别执行:
where python pip --version再看VSCode右下角的状态栏,确认显示的解释器路径和你刚才执行pip的python路径是同一个。路径不一致,就手动切换解释器。这个坑特别隐蔽,因为它不是报错报出来的,而是你自己对不上号。
2.3 从装库到写代码之间的"环境验证"
装好库之后,别急着写大段逻辑。先在命令行里做个最小验证:
python -c "import matplotlib; print(matplotlib.__version__)"能打印出版本号,说明环境OK。这一步很像你组装电脑时先点亮主板再装系统,把变量控制住,后面代码出问题的时候,你至少能排除环境因素,专心查逻辑。
3. 代码从零到跑通:核心逻辑的一步步拆解
3.1 先写最小可运行版本
完成环境搭建之后,我第一次写的版本非常简单粗暴,连异常处理都没有,但每一步都能看到输出结果。先读数据,打印出来看看:
import csv file_path = "sales_data.csv" with open(file_path, mode="r", encoding="utf-8") as f: reader = csv.DictReader(f) rows = list(reader) print(rows[:3])csv.DictReader会把每一行转成一个字典,键就是CSV的表头。看到打印出来的前几行,确认读取成功,再往下写。这种"跑一步看一步"的方式,能让你清楚知道问题出在哪一段,不会写了一大坨代码然后面对满屏报错干瞪眼。
3.2 用字典完成分组累加:为什么不用列表
统计每个产品的总销售额,我当时第一想法是用列表,每个元素装一个产品名和一个累计值。但很快发现一个问题:每来一条数据,都得先遍历列表,看看这个产品名之前出现过没有,如果列表里有1000条数据,那么每读一行记录都要做一次O(n)的查询,性能差、代码也绕。
字典就聪明多了:产品名当键,累计销售额当值,代码量少、逻辑直观:
total_sales = {} for row in rows: product = row["产品名称"] quantity = float(row["销量"]) price = float(row["单价"]) sales = quantity * price total_sales[product] = total_sales.get(product, 0) + sales print(total_sales)注意那个get(product, 0)——第一次遇到这个产品名时,字典里没有它,就返回默认值0,然后加上当前这条数据的销售额;以后再遇到同一个产品名,就在已有基础上继续累加。这个写法是Python里非常经典的"分组聚合"模式,后面学pandas的groupby会遇到同样的思路。
3.3 按日期聚合,为画图准备数据
画折线图需要一组x和一组y。x是日期,y是当天的总销售额。逻辑跟按产品分类一模一样,只是换了个键:
daily_sales = {} for row in rows: date = row["日期"] quantity = float(row["销量"]) price = float(row["单价"]) sales = quantity * price daily_sales[date] = daily_sales.get(date, 0) + sales dates = sorted(daily_sales.keys()) amounts = [daily_sales[d] for d in dates]sorted之后,日期才能沿着时间轴从左到右排列,不然折线图会乱成一团。
4. 画图阶段的三个真实报错:横坐标挤成一团、中文方块、窗口闪退
4.1 横坐标太密集:从调整刻度到解决问题的思路
我第一次把dates和amounts扔给matplotlib,图是出来了,但横坐标的日期标签全部重叠在一起,黑乎乎一片根本看不清。这类问题热搜里常年出现"python画图横坐标太密集",说明不是只有我遇到过。
很多人的第一反应是旋转角度,比如plt.xticks(rotation=45),但这只能稍微缓解,标签多了照样重叠。我当时试了好几次,最后结合数据规模想明白了:日期有几十个,画在同样宽的图里,再怎么旋转也不可能全部清晰显示。
最终可行的方案是——减少显示的刻度数,让图表自动挑几个位置显示标签:
import matplotlib.pyplot as plt plt.figure(figsize=(12, 6)) plt.plot(dates, amounts, marker="o", linestyle="-") plt.title("每日销售额趋势") # 横坐标间隔取步长,避免全部挤在一起 step = max(1, len(dates) // 10) plt.xticks(ticks=range(0, len(dates), step), labels=[dates[i] for i in range(0, len(dates), step)], rotation=30) plt.tight_layout() plt.show()len(dates) // 10的意思是:最多大概显示10个刻度标签,然后按这个步长等间隔取。这个经验后面扩展到所有时间序列图都好使,核心逻辑是"图表宽度有限,标签宁可少而清,不能多而糊"。另外记住plt.tight_layout(),它会自动调整边距,让你的标签不会被裁掉。
4.2 中文显示成方块:font的那点事
画出来的图,标题坐标轴全是小方块,典型的中文字体缺失。matplotlib默认字体里没有中文字符集,你得手动指定一个系统里存在的中文字体。
Windows系统一般有"Microsoft YaHei"(微软雅黑),macOS用"SimHei"或者"PingFang SC",写法是这样的:
plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"] plt.rcParams["axes.unicode_minus"] = False第二行是专门处理负号显示的,防止坐标轴上的负号变成乱码方块。字体设置这件事,写一次就记住,后面所有中文图表都用得上。
4.3 窗口一闪而过:学会保存图片而不是只依赖显示
在命令行(cmd)里跑画图脚本,图一弹出来,程序一结束窗口就关了,有时候你连看清楚的机会都没有。这个问题本质上是因为plt.show()是阻塞式的——它在事件循环里等窗口关闭,但某些环境里这个等待会被跳过,导致窗口闪现。
最稳妥的办法是直接保存成图片文件,显示不显示的再说:
plt.savefig("daily_sales.png", dpi=150)我后来养成的习惯是每个画图脚本都加一行savefig,既满足了作业上交需要,也避免了窗口关闭看不到结果的尴尬。dpi设为150以上,图片放大也清晰。
5. 数据导出的坑:openpyxl、pandas和Excel的缘分
5.1 第一次写入Excel的翻车现场
统计结果要写进Excel文件。当时我第一反应是"能不能直接用Python打开Excel往里填",后来才知道有个专门的库叫openpyxl,底层能直接读写字幕Excel文件。
用pandas一行也能搞定:
import pandas as pd result_df = pd.DataFrame(list(total_sales.items()), columns=["产品名称", "总销售额"]) result_df.to_excel("sales_summary.xlsx", index=False)这里感谢我们第一节课学过的pandas基础。你需要安装pandas和openpyxl两个库,因为pandas写Excel时,背后实际调用的是openpyxl或xlwt来生成文件。
5.2 中文路径和文件找不到的坑
还有一个极其常见的坑——CSV文件和Python脚本放在同一个文件夹,但用记事本打开看编码是ANSI(也就是GBK),直接用utf-8去读会报UnicodeDecodeError。解决方式是在open函数里指定正确编码,或者把编码参数改成gbk:
with open(file_path, mode="r", encoding="gbk") as f:我现在处理不确定编码的文件时,会先做一个快速的编码探测,用chardet库或者直接试错法,试utf-8不行就换gbk。另外,Windows下文件路径里的反斜杠在Python字符串里有转义含义,建议统一用正斜杠('C:/Users/xx/sales_data.csv')或者写成双反斜杠,否则你可能遇到明明文件存在却报FileNotFoundError的诡异事情。
5.3 确认输出的完整流程
导出Excel之后,最好再读回来验证一次:
check_df = pd.read_excel("sales_summary.xlsx") print(check_df.head())这一步看似多余,实则是防止你写出来的文件打不开或者内容错位。这是我踩过写入成功但Excel打开乱码的坑之后养成的习惯:所有输出文件,务必回头读一遍。
6. 第一次作业如何从"能跑"变成"优秀":我的增光添彩清单
6.1 封装成函数,让代码有骨架
交作业前,我把一整坨代码拆成了三个函数:read_and_compute()负责读取和聚合,plot_daily_trend()负责画图,export_excel()负责导出。每个函数只做一件事,主流程只有短短几行调用。这样改完之后,代码的可读性立刻就不一样了——阅卷老师一眼就能看出你理解了"函数封装"这个概念,而不是把所有内容堆在全局作用域里。
Python里的def定义函数,第一次觉得难,一旦把功能模块化之后,你会发现后续的一切调整都变得简单。比如我想换一个统计维度,只需要新增一个函数,不需要去改动计算逻辑。
6.2 异常兜底和防御性编程
作业要求里没提异常处理,但代码写上异常兜底,评分档次直接不一样。我在读文件那段加了判断:
import os if not os.path.exists(file_path): raise FileNotFoundError("找不到数据文件,请检查路径")在计算核心那段用try-except包裹,捕获可能出现的ValueError,防止某行数据里有脏数据导致程序直接崩溃。这些"防御性编程"的习惯在真实工作场景里非常重要——数据永远没有你以为的那么干净。
6.3 写注释的时机和分寸
我给代码写的注释不多,但每一条都在关键的逻辑转换处。比如字典聚合那句,我写的是"# 利用dict.get的特性实现分组累加"——注释解释的是思路而非语法,这才是有价值的注释。
7. 复盘:第一份Python作业究竟在练什么
7.1 检验你"真懂"的四个标准
作业交了、分数拿到了,这事儿就完了吗?我后来复盘的时候发现,这份作业真正在检验的东西远不止"会不会写代码"四个字:
- 会不会自己查错:报错信息里的Traceback,你能否定位到具体行;
- 会不会选型:什么时候用字典,什么时候用列表,什么时候需要引入第三方库;
- 会不会查文档:函数的签名、参数默认值,你能否理解并正确使用;
- 会不会验证结果:程序跑完了,如何确认结果是对的,而不是"看起来像对的"。
这些能力,恰恰是后续所有Python项目的地基。
7.2 下一步能往下走的方向
如果你也想在这个基础上继续往下挖,我的建议有几个:一是把CSV的处理换成更真实的场景,比如做爬虫抓数据后落盘,顺便学学请求头、timeout、解析库;二是把每日销售额迁移到pandas的groupby + resample,体验一下"数据框架式"思维;三是尝试用matplotlib做更多类型的图,比如柱状图、饼图,理解不同图表的使用场景。另外把"连接cmd"、"写入excel"这些标签串起来,你会发现Python之所以被这么多人学,就是因为它能把你日常工作中杂乱的零碎操作用代码自动串起来。
回头再看这份第一次作业,它远不止一笔分数,更像是一张地图,把Python里最核心的操作——读写文件、处理数据、画图、导出结果——全部标了出来。每一个坑都是成长点位,每一次报错排查都是独立解决问题的演练。踩坑不可怕,踩完能说清楚坑在哪、为什么掉进去,才算真正学会。要是你的第一次作业也正在这些坑里扑腾,照着上面的步骤一步步来,一定能把坑填平。