上周刚把python作业二交上去成绩不算顶好但这次从拿到题目到调试通过踩的坑和总结的经验我觉得比分数更有价值。如果你也是刚开始学Python、正在被课堂作业折磨的同学这篇复盘应该能帮你省下不少时间。这次的作业说是基础题其实从环境配置到库安装从函数定义到数据可视化几乎把入门阶段最常遇到的所有问题都过了一遍做完之后再去写爬虫、做数据分析心里会踏实很多。作业总共四道题一道函数计算、一道列表切片、一道NumPy数组处理、一道Matplotlib绘图导出。看着都不难但实际操作里面全是细节。下面按我的完成顺序一点点拆开讲。1. 先别写代码把作业需求拆成能执行的小点1.1 拿到题目我先做了什么第一次看到题目的时候我的第一反应是打开编辑器直接写。结果第一题就翻车了题目要求函数返回多个值我只写了一个 return后面对照预期输出怎么都对不上。后来我学乖了拿到任何作业先做两件事。第一步是把每道题的要求用一句话复述清楚拆成“输入是什么、输出是什么、中间要做什么处理”。比如第一题是“输入身高体重输出BMI值和一个健康等级”第二题是“给定一个列表得到指定位置的切片并反转”第三题是“用数组计算一堆数据的平均值和标准差”第四题是“把折线图画出来并且横坐标刻度不重叠”。这样拆完脑子里基本就有轮廓了。第二步是把需要用到的知识点提前过一遍。我当时把函数定义、列表切片、NumPy基本操作、Matplotlib的常用函数在教程里迅速翻了一遍心里有个数。别小看这一步它能帮你提前发现哪些地方容易卡住比如切片步长为负数时到底怎么取画图时间隔太密怎么处理这些后来都成了我debug的重点。1.2 这几次作业到底在考什么把四道题看完其实能发现一个共同点老师不是在考你背语法而是在练“输入-处理-输出”这条完整链路。函数题练的是怎么封装一段逻辑列表题练的是怎么操作批量数据NumPy题练的是怎么处理数值型数据画图题练的是怎么把结果可视化。这些恰恰是以后做数据分析、爬虫、甚至量化交易策略代码的时候最常用的能力。我把考察点和对应的知识点整理成了一张表后面复习也用得上。题号表面任务核心知识点常见翻车点第一题计算BMI并输出等级def定义函数、参数传递、返回值、字符串格式化忘了转换input为float函数返回None第二题列表切片反转列表索引、切片、负步长边界混淆、切片后返回新列表第三题数组统计计算NumPy的array、mean、std、广播维度不一致、数组和列表混用第四题绘图导出Matplotlib、中文显示、xticks旋转横坐标标签挤成一团、坐标轴标题乱码看清楚考察点之后后面每一步都围绕这些点补漏洞效率会高很多。2. 环境准备与工具选择别让安装问题浪费一晚上2.1 装好Python和VSCode就能开工吗答案是能但要注意几个坑。我刚开始装的是官网下载的Python装完直接在VSCode里写代码。VSCode配置很简单装一个Python扩展然后把解释器路径指到Python安装目录就行。但这里有个非常隐蔽的问题VSCode左下角选择的解释器跟你安装Python的版本一定要对得上否则后装库的时候会出现“代码里能import但运行报ModuleNotFoundError”。我自己就遇到过这种情况系统里有一个Anaconda自带的PythonVSCode自动选了那个然后我用终端pip install的库装到了另一个Python里结果两边对不上。后来检查了很久才发现是解释器选错了。新手建议在VSCode里用命令面板选解释器确认指向你常用的那个Python路径并且在同一个终端里执行pip安装和运行脚本能避免大量奇怪问题。2.2 装第三方库直接用镜像源作业里需要NumPy、Matplotlib这两步按理说很简单但第一次直接执行pip install numpy的时候网络慢到怀疑人生后来换成了国内镜像源才顺畅。我的做法是打开终端执行pip install numpy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple这里稍微解释一下为什么用镜像源。pip默认去官方PyPI下载虽然稳定但有时候连接很慢。清华、阿里、豆瓣这些镜像源把PyPI的包同步了一份下载速度快很多。以后装pandas、scikit-learn也就是sklearn也是一样的思路只要加一个-i参数就能解决。需要注意的是如果用了conda或venv虚拟环境要在对应环境里执行pip install别装到别的环境去。2.3 关于环境管理的一点建议很多教程会让你学conda或者venv但对普通作业来说不是必须的。我个人的体会是第一周作业阶段你只需要一套能跑的Python环境就够了别引入太多概念。等你真正开始做项目或者同时需要多个Python版本的时候再去了解conda和venv也不迟。作业阶段遇到环境问题优先考虑这个顺序确认解释器路径确认库装在了哪个环境用镜像源重装再检查代码里import的名字有没有写错。3. 四道题的实操拆解与关键代码3.1 第一题函数定义与常见的def误区题目大概是要求写一个计算BMI的函数然后根据数值输出“偏瘦、正常、偏胖”这样的等级。我最初的版本长这样def calc_bmi(weight, height): bmi weight / (height ** 2) if bmi 18.5: print(偏瘦) elif bmi 24: print(正常) else: print(偏胖) return bmi w input(请输入体重(kg): ) h input(请输入身高(m): ) result calc_bmi(w, h) print(result)跑起来发现结果很奇怪因为input返回的一直是字符串字符串和数字做除法会直接报错。解决办法就是在传给函数前做类型转换w float(input(请输入体重(kg): )) h float(input(请输入身高(m): ))这题虽然简单但把入门阶段最容易踩的三个坑都集中踩了一遍input需要类型转换、函数里要明确return还是print、函数名避免和内置函数冲突。我把函数名从bmi改成calc_bmi就是为了避免和任何变量名混淆。另外函数参数和全局变量的关系也要注意函数内部用到的变量如果没有return外面是拿不到的。3.2 第二题列表切片与负步长第二题是给定一个列表比如numbers [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]要求取索引2到索引7之间、步长为2的元素然后反转输出。直接写numbers list(range(10)) slice_part numbers[2:8:2] print(slice_part) print(slice_part[::-1])这里第一个print得到[2, 4, 6]第二个print得到[6, 4, 2]。切片的核心规则是左闭右开numbers[2:8]包含索引2但不包含索引8。负步长[::-1]是完整的反转操作这个细节很多新手第一次会踩。我当时把切片写成了numbers[8:2:-2]顺序一下乱掉得出来的结果和预期完全不一致。有个生活化的类比切片就像在一排柜子里按“起始柜到结束柜之前、每隔几个柜子取一次”的规则拿东西。正步长是从左往右拿负步长是从右往左拿非常容易搞混。建议每次写完切片先print一下用肉眼确认结果再继续往下写。另外还要注意切片不会修改原列表它返回的是一个新的列表如果后面还要用原列表不用担心被破坏。3.3 第三题用NumPy做数组计算第三题要求计算一组数值的平均值、标准差和中位数。这里如果用纯Python的列表写循环也能算但代码又长又慢。正确姿势是用NumPyimport numpy as np data [172, 168, 175, 180, 165, 170, 169, 176, 183, 171] arr np.array(data) print(np.mean(arr)) print(np.std(arr)) print(np.median(arr))这里要理解一个关键差异普通列表和NumPy数组的区别。列表里的元素是一堆独立的引用数组则是一块连续内存所以NumPy能高效做批量运算。比如计算每个身高和平均值的差用数组一行就搞定diff arr - np.mean(arr)这种写法叫广播意思是数组自动把标量和每个元素做运算。如果用Python列表写得写for循环。我第一次用列表尝试运行这段代码直接报“unsupported operand type(s)”就是因为列表不支持减法广播。换成数组之后清爽很多。这题的另一个隐藏知识点是np.mean和arr.mean()两种写法都行结果一样。作业里如果要求保留小数可以用np.round(result, 2)。以后做量化交易策略代码的时候这种批量数组运算几乎无处不在所以刚开始一定要把数组和列表的关系搞清楚。3.4 第四题Matplotlib画图与横坐标太密的解决方案第四题是给一批数据画折线图数据是逐月温度变化大概有几十个点。我第一版写完直接plt.show()屏幕上出现一团黑横坐标标签全部叠在一起根本看不清。这就是热搜里常见的“python画图横坐标太密集”问题。原因很简单当横坐标数量超过十几个图Matplotlib默认把每个点都画上标签标签之间空间不够就互相遮挡。解决办法有几种我给一个最常用的import matplotlib.pyplot as plt months [2024-01, 2024-02, 2024-03, 2024-04, 2024-05, 2024-06, 2024-07, 2024-08, 2024-09, 2024-10, 2024-11, 2024-12, 2025-01, 2025-02] temps [-2, 1, 8, 15, 22, 28, 30, 29, 24, 17, 9, 1, -1, 3] plt.figure(figsize(10, 5)) plt.plot(months, temps, markero, colorb) plt.xticks(rotation45) plt.xlabel(月份) plt.ylabel(温度(°C)) plt.title(月度温度变化) plt.tight_layout() plt.show()关键就是这一行plt.xticks(rotation45)把标签旋转45度再加上tight_layout()自动调整间距黑乎乎的叠字问题基本解决了。如果数据更多比如有100个点旋转也救不了那就要每隔若干个点才显示一个标签step 10 plt.xticks(ticksrange(0, len(months), step), labels[months[i] for i in range(0, len(months), step)], rotation45)这样每隔10个点显示一个页面立刻干净。我当时为了让图好看还顺手设置了figure的宽度数据少的时候用figsize(10,5)数据多用更宽的画布也是很实用的技巧。4. 作业里的隐藏关卡文件读取与Excel导出4.1 读取文本文件时被编码坑惨了作业的第四题还需要从本地文件读数据文件是一行一个数值的记事本格式。我直接用open(data.txt)去读结果运行时报UnicodeDecodeError原因是Windows记事本保存的文件默认是GBK编码而Python默认用UTF-8解码。解决办法是读取时显式指定编码with open(data.txt, r, encodingutf-8) as f: lines f.readlines()如果文件是GBK编码就把encoding改成gbk。这里有一个更稳妥的判断思路先用记事本打开文件看看右下角显示的编码或者用Python的chardet库自动识别但作业阶段直接试utf-8和gbk基本能解决。用with open的好处是文件用完后会自动关闭不会留下文件句柄。我见过有些同学用f open(data.txt)用完忘记f.close()结果在后续操作里出现各种莫名其妙的问题。所以无论读取还是写入推荐都用with语句。4.2 用pandas把结果写入Excel作业最后一步要求把统计结果保存成Excel表格。我一开始还想着用csv模块手写表格后来同学提醒才想起有pandas这个东西。pandas处理结构化数据非常方便三行代码就能导出import pandas as pd result_dict { 平均值: [np.mean(arr)], 标准差: [np.std(arr)], 中位数: [np.median(arr)] } df pd.DataFrame(result_dict) df.to_excel(result.xlsx, indexFalse)注意to_excel依赖openpyxl库第一次运行会报ModuleNotFoundError: No module named openpyxl装一下就行pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple我在这个环节还踩过一个坑pandas写出的Excel如果数组维度不对会出现“If using all scalar values, you must pass an index”的报错。原因是用字典创建DataFrame时如果值为标量而不是列表pandas分不清是单行还是多行。解决办法就是用列表包一下比如写成{平均值: [np.mean(arr)]}而不是{平均值: np.mean(arr)}。对作业来说能把结果落到Excel里整个链路就完整了。以后在公司里自动拉表、写报表基本就是这套东西的升级版pandas读数据处理完再to_excel输出。5. 调试实录我踩过的坑和排查方法5.1 ModuleNotFoundError到底怎么查这个错误我连续遇到了两次。一次是上面说的openpyxl一次是sklearn。遇到这种报错先不要急着重复pip install先跑一下pip list看看包里有没有。如果确实没有再安装。如果pip list里有代码还是报错重点检查两件事当前终端里处在哪个Python环境VSCode里选中的解释器是不是同一个。很多新手被这个问题折磨一晚上其实就是解释器指错了。5.2 代码运行完什么输出都没有这种情况最让初学者抓狂。原因一般是三种函数定义了但没调用print拼错了代码块缩进不对导致print在函数外面而函数压根没执行。我有个很笨但很有效的办法在关键位置插入print(checkpoint)看程序到底走没走到那里。等确认逻辑没问题再把临时的print删掉比空想快得多。5.3 函数返回了None第一题我一开始就犯了这个错只print了结果没有return然后调用函数后用变量接收打印出来就是None。这个问题的本质是函数默认返回None只有写return才会返回实际值。想清楚函数是“只执行动作”还是“执行动作并给结果”这个问题就解决了。5.4 一张方便粘贴的常见问题速查表报错或现象原因快速解决ModuleNotFoundError库没装或解释器不对pip install后重跑检查VSCode解释器UnicodeDecodeError文件编码和指定编码不一致读取时指定encodingutf-8或gbkUnsupportedOperandType列表直接做数学运算先把数据转成np.array函数返回None没有return或return写得不完整检查函数末尾是否有return语句横坐标标签重叠标签太多、间距不足用rotation45和tight_layout或隔几个点显示画图中文乱码默认字体没有中文字符设置plt.rcParams[font.sans-serif] [SimHei]并解除unicode负号中文乱码这个坑当时也花了我十分钟。高版本Matplotlib在Windows上默认字体不含中文字符串显示出来是一堆方框。解决方法是开头加两行plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False第二行是为了让坐标轴上的负号正常显示。如果用的是Mac字体名改成Arial Unicode MS或者PingFang SC之类的因为系统自带字体不同。6. 一次作业能带来的额外收获做完这四道题我最大的感受是作业只是外壳真正要学的是“遇到问题怎么拆解、怎么调试、怎么查资料”。比如这次我用到的NumPy数组、Matplotlib绘图、pandas导出Excel看起来是几道独立题目但它们组合起来就是一套小型数据处理的工作流。这种工作流以后做爬虫数据分析、甚至量化交易策略代码的时候都能直接复用。比如你爬了一堆股票数据先用pandas清洗再用NumPy算指标最后Matplotlib画K线和趋势图节奏跟这次作业一模一样。还有一个体会是遇到报错别慌先读报错信息。Python的报错信息里通常带着行号和错误类型比如NameError、TypeError、IndexError把这些关键词复制到搜索引擎基本都有现成答案。很多同学一看到红色报错就迷茫其实大多数报错已经在告诉你该怎么改了。最后说一句python作业二这种阶段性的小任务价值不在分数而在让你把每个“看似简单但做起来全是坑”的知识点真正过一遍。多花点时间把函数、切片、数组这些基本功打牢后面写复杂代码的时候会轻松很多。