ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python入门第5天复盘:切片、矩阵与文件读写实战

Python入门第5天复盘:切片、矩阵与文件读写实战 今天是我正儿八经学 Python 的第 5 天。回顾前 4 天基本就是第 1 天折腾安装和环境变量第 2 天搞明白变量和 print第 3 天被 if-else 和 for 循环折磨到怀疑人生第 4 天总算对函数有了点感觉。到了第 5 天神奇的事情发生了很多之前零散的知识点开始连成一条线矩阵、切片、文件操作这些稍微进阶一点的内容居然也能磕磕绊绊自己写出来了。这篇就把 python 入门第 5 天学到的东西做一个完整复盘包括我踩过的坑、用过的工具、做的小练习和可以直接抄走的小脚本给同样在第 5 天左右挣扎的朋友一个参考。1. 第 5 天该学什么先看清整个入门路线1.1 前 4 天的学习地图我用了 4 天时间把所有基础环境铺好。第 1 天是安装 Python 和 VSCode第 2 天开始写第一行 print(hello world)同时搞清楚了变量是什么、怎么命名、有哪些基本类型第 3 天重点啃了 if 判断和 for/while 循环第 4 天专门练函数从 def 到参数传递再到返回值把函数的两种调用方式都过了一遍。这个过程看起来平平无奇但实际走下来发现前 4 天最大的价值不是记住了多少语法而是建立了一种“报错不可怕”的心理预期。几乎每个初学者都会被 SyntaxError 和 TypeError 吓到但当你第 10 次看到红色的报错信息时你会开始下意识地读它、分析它而不是关掉窗口。这个心态转变比多背 10 个语法点都重要。到了第 5 天语法方面已经不需要再看教材了这时候最该做的是三件事第一把列表这个最核心的数据结构彻底吃透尤其是切片和嵌套列表第二学会文件的读写因为几乎所有实际项目都离不开文件第三做至少一个能运行完整流程的小脚本把变量、循环、函数、列表全部串起来用一遍。1.2 第 5 天的核心目标我给第 5 天定的目标很简单不学新的大语法只做整合和拔高。具体来说有三个检验点。第一个是能不能用嵌套列表表示一个矩阵并且能够正确地访问和修改矩阵里的元素这是一个很容易出错的地方后面我会专门讲。第二个是能不能熟练地对列表和字符串进行切片操作包括正着切、反着切、跳着切。第三个是能不能自己写一个带文件读写的完整脚本比如从一个文件里读出所有行筛掉重复的内容再写到另一个文件里。这三个任务如果都能独立完成那说明前 4 天的语法基础已经变成了真正的编程能力。第 5 天学到的核心不是某个神奇的库或者高等算法而是“把零散知识组装成程序”的整合能力这个能力一旦建立起后面的爬虫、数据处理、Web 开发才有抓手。2. 先摆平环境安装、配置与编辑器2.1 Python 版本选择与官网下载说实话前 4 天里我花了将近一整天在折腾环境。第 5 天回头看这部分其实有非常明确的套路完全可以更高效地搞定。第一件事是选择版本。很多人上来就装最新版其实大可不必。我现在用的是 Python 3.8在官网的 Downloads 页面往下拉找到 Windows 下的 64 位安装包下载 executable installer 这种格式就行。为什么推荐 3.8 而不是更新的版本主要原因是很多第三方库对于最新版 Python 的支持有延迟尤其是 cv2 这种重量级的库用到的时候如果发现 whl 文件装不上会非常崩溃。3.8 是兼容性最稳的一个版本几乎所有的库都有对应的安装包对于入门期来说稳定比尝鲜重要得多。安装的时候有一个关键勾选项在 Installer 窗口的最下面一定要把 “Add Python 3.8 to PATH” 这一项打勾。这一步不做后面环境变量就得手动配多出一堆麻烦。安装路径默认在 C 盘就行不用改除非你对 C 盘空间有洁癖。2.2 环境变量和 pip 的配置如果你和我一样第一次安装的时候忘了勾选 Add to PATH那么后面就会遇到 “python 不是内部或外部命令” 的报错。这时候需要自己去系统里配右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 在系统变量里找到 Path → 编辑 → 新建 → 把 Python 的安装路径比如 C:\Users\你的用户名\AppData\Local\Programs\Python\Python38和它的 Scripts 子目录都加进去。配好之后重新打开一个命令行窗口输入 python --version看到 Python 3.8.x 就说明成功了。还要顺手做一件事把 pip 的下载源换成国内镜像。这一步不换后面安装 numpy、cv2 这些库的时候下载速度会让你怀疑人生。我换的是清华源命令很简单pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple实测下来换源之后 pip install numpy 只需要几秒钟之前可能要等好几分钟还经常超时。这个操作别看简单能帮你省掉大量排队等待的时间。2.3 VSCode 里的 Python 配置编辑器我用的是 VSCode配合 Python 扩展。安装扩展的方法是在扩展商店里搜 “Python” 然后点击安装这个没什么难度难的是安装完之后让 VSCode 识别到正确的 Python 解释器。按下快捷键 Ctrl Shift P在命令面板里输入 “Python: Select Interpreter”选择你安装的那个 Python 3.8。这一步做完之后VSCode 才会在运行代码的时候自动使用正确的环境。如果你打开快捷键 Ctrl 启动的内置终端敲 python 进入交互模式能看到版本号一致那编辑器这块就算配完了。配置完 VSCode 之后还有一个隐形好处左侧的“运行”按钮可以直接运行 Python 文件报错信息会以列表形式显示在“问题”面板里比命令行里看报错要直观得多。前 4 天我都是靠这个面板快速定位语法错误位置的。3. 把前 4 天的底子补牢变量、类型与函数3.1 变量与类型做题比看教程有效进入第 5 天之后我做的第一件事不是学新东西而是找了几套“变量的类型练习题”来做。搜索结果里全是五花八门的选择题其实内容大同小异核心就考三个点字符串能不能跟整数直接相加、列表能不能作为字典的键、变量名能不能以数字开头。做完题我发现一个规律看教程十遍不如写错一遍记得牢。比如我第一次写 a 5然后写 b hello再写 print(a b)现实直接给我教育了一课——TypeError: unsupported operand type(s) for 。看到这个报错的时候我才真正记住了动态类型和强类型之间的微妙差别。Python 允许你把变量从整数类型改成字符串类型但是不允许你在运算的时候随意混用不兼容的类型。变量这一块还有一个特别容易踩坑的点是“变量的覆盖”。如果你在函数里面定义一个变量名字和全局变量一样Python 会默认使用函数内部的局部变量而你如果没有用 global 关键字又试图在函数里修改外部变量运行结果就会和预期完全不一样。这个坑我在第 4 天函数章节就踩过第 5 天又复习了一遍才彻底明白。3.2 类型转换int()、str()、float()、list()类型转换是第 5 天做练习题时必然会用到的操作。实际开发中你从文件里读出来的数据默认都是字符串python 画图时横坐标太密集需要把字符串转成 int量化交易里的数字处理离不开 float()这些场景全都需要显式转换。需要注意几个细节。int(3.14) 会报错必须先转成 float 再转成 intint(abc) 也会报错如果字符串里混入了非数字字符你可以在调用前加一个 try-except 或者先用字符串方法判断一下比如 value.isdigit() 返回 True 才调用 int()。还有 list() 的用法list(hello) 会得到 [h,e,l,l,o]这个可以把一个字符串拆成字符列表在后面的字符串处理里非常好用。反过来如果你有一个列表想要合并成字符串可以用 .join(list)这个方法把列表中的元素用指定分隔符拼接是 Python 里最优雅的字符串处理方式之一。3.3 函数定义再复习一遍 def 和 return第 5 天的练习做下来我发现函数其实归结起来就三句话def 后面跟函数名参数放在括号里返回值前写 return。但真正写程序的时候函数的设计比语法更重要。我总结了一个非常实用的经验一个函数最好只做一件事。比如我现在要写一个脚本统计一篇文章里每个单词出现了几次我会拆成三个函数——read_file 负责读文件split_words 负责把文本切成单词列表count_words 负责统计频率。这样拆分之后如果运行结果不对我只需要单独测试某一个函数很快就能定位到问题而不是在一大坨代码里找 bug。这个拆分习惯是第 5 天做“李白打酒”这道题时真正想明白的。那是一个经典的逻辑题网上有各种版本的解法我自己的思路是用函数递推来实现后来发现用 while 循环也完全可以。真正重要的不是哪种解法更优雅而是你能把它们讲清楚、拆明白。4. 第 5 天重头戏切片、矩阵与经典题实践4.1 列表切片处理数据的万能剪刀切片是第 5 天学到的所有技能里我觉得性价比最高的一个。它的语法就一句话list[start:end:step]表示从 start 开始到 end 为止不包括 end每隔 step 取一个元素。举几个实际用到的例子。我想把列表 [0,1,2,3,4,5,6,7,8,9] 中的奇数取出来直接 arr[1:10:2] 一步到位。我想把整个列表倒过来写成 arr[::-1] 即可这个写法在判断回文时特别好用。我想把前 3 个元素全部改成同一个值切片赋值可以直接操作。注意一个非常容易出错的地方切片的下标是左闭右开区间。arr[0:5] 取的是第 0 到第 4 个元素第 5 个不在里面。很多新手包括我前 4 天都会在这里栽跟头写 arr[0:5] 以为取到 5 个元素实际得到的是 6 个如果原列表够长。你只要记住“下标指的是‘切刀’的位置而不是元素的编号”就不会再犯这个错误了——0 号下标其实是在第 0 个元素的前面所以 arr[0:5] 切走的是从第 1 个元素到第 5 个元素之间的那一块。4.2 嵌套列表与邻接矩阵理解二维结构第 5 天的练习题里有一道是“python 构建邻接矩阵”。邻接矩阵是图论里的概念简单说就是用二维列表来表示图中节点之间的连接关系如果节点 i 和节点 j 之间有边那么 matrix[i][j] 就写 1否则写 0。对于一个 n 个节点的图邻接矩阵就是 n 行 n 列的二维列表。我第一次尝试构造全 0 矩阵时直接用 matrix [[0] * n] * n结果发现改一个元素整列都跟着变。这个错误困扰了我一个下午。原因在于[[0] * n] * n 是先创建了一个长度为 n 的列表然后复制了 n 次这个列表的“引用”也就是说这 n 行其实指向的是同一个内存地址。正确的写法是使用列表推导式n 3 matrix [[0 for _ in range(n)] for _ in range(n)] matrix[0][1] 1 print(matrix)这段代码得到的矩阵是 [[0,1,0],[0,0,0],[0,0,0]]只有你想修改的那个元素变了。列表推导式在这里的作用是每一行都新建一个独立的列表对象避免引用共享的坑。建好矩阵之后我还练习了“python 矩阵 0”的处理也就是把矩阵指定位置置零、或者统计矩阵中零的个数。这些操作本质上就是两层 for 循环遍历所有元素加上一个 if 判断。当你能够熟练地用嵌套循环遍历二维列表并且分清外层循环是行、内层循环是列时对二维结构的理解就过关了。4.3 李白打酒一道经典的循环逻辑题“李白打酒”是我第 5 天做的最后一道纯逻辑题非常适合用来检验前几天的学习成果。题目大概是这样的李白街上走提壶去买酒遇店加一倍见花喝一斗三遇店和花喝光壶中酒试问壶中原有多少酒。我用的解法是逆向递推第三次遇到花之后酒喝光了说明第三次遇到花之前壶里有 1 斗酒第三次遇到店之前因为店会加一倍所以壶里有 0.5 斗再往前推第二次遇到花之前是 1.5 斗第二次遇到店之前是 0.75第一次遇到花之前是 1.75第一次遇到店之前是 0.875。答案是 7/8 斗。写代码的时候如果顺着题目正向推会很麻烦因为不知道初始酒量。逆向推就简单多了wine 0.0 for i in range(3): wine wine 1 # 逆推见花反向加回一斗 wine wine / 2 # 逆推遇店反向减半 print(wine)运行结果是 0.875和手算答案一致。这道题虽然简单但它强制我用“反向思考”的方式重新组织逻辑这比多背几个语法点收获更大。后来我发现这种逆向思维在做很多算法题时都是关键突破口。5. 文件操作与实战小脚本5.1 文件读写的基本套路第 5 天之前我一直觉得文件操作是很高级的东西真正学起来才发现套路非常固定。读文件三步走open 拿到文件对象read 或 readlines 读取内容最后 close 关闭文件。为了防止忘记 close更推荐用 with 语句它会自动帮你关闭文件with open(input.txt, r, encodingutf-8) as f: lines f.readlines()写文件则是 open 时把模式改成 w 或 a前者是覆盖写入后者是追加写入。需要注意模式和编码这两个参数。模式选错了会报错或者覆盖掉你不想覆盖的内容编码如果设成默认的读 Windows 下生成的中文文本很可能会出现乱码所以读中文文件时 encodingutf-8 基本是标配。我在实际操作中还碰到一个很小的坑当文件路径里有反斜杠时直接写在字符串里会被当成转义字符比如 C:\new\data.txt。解决办法有两个要么写成 C:\new\data.txt把反斜杠写双份要么写成 rC:\new\data.txt加一个 r 前缀表示原始字符串。这个细节看着不起眼实际写代码时能卡住你两分钟。5.2 实战筛选重复数据的小脚本第 5 天的实战练习我选了一个贴合实际的小需求有一份文件里每行是一个字符串里面有不少重复项我需要写一个脚本去重并保存到新文件。这个需求对应了热搜词里的 “python 筛选一样的”我写的第一版代码如下with open(data.txt, r, encodingutf-8) as f: lines [line.strip() for line in f.readlines()] seen set() result [] for line in lines: if line not in seen: seen.add(line) result.append(line) with open(result.txt, w, encodingutf-8) as f: f.write(\n.join(result))这段代码短小但是涵盖了 5 天的核心知识列表推导式、for 循环、set 的去重特性、文件的读写、字符串的 strip 和 join。运行之后result.txt 里就是去重后的内容顺序还保持原文件的顺序。set 在这里是关键它的查找速度是 O(1)比用 list 里的 not in 去判断快得多。当处理几千行数据时用 list 的话运行时间会随着数据量平方级增长用 set 几乎没有任何感知。这也是 Python 内置数据结构最典型的“选对工具”场景。做完这个脚本我又加了一个功能统计每个数据出现的次数。只需要把 seen 换成字典 counts每来一行就 counts[line] counts.get(line, 0) 1。这个 get 方法是字典的常用技巧键不存在时返回默认值 0避免手动判断。5.3 模板字符串和格式化输出的两个小技巧写脚本过程中我经常需要把结果输出到屏幕上看一眼。第 5 天学到的最实用的两种字符串格式化方式是 f-string 和 format 方法。f-string 就是字符串前面加一个 f然后用大括号直接把变量名写进去name python version 3.8 print(f我在学{name}版本是{version})这种写法比之前的 % 格式化直观太多了尤其是打印多行统计结果时一眼就能看出每个数字对应的含义。format 方法稍微老一点但用法也简单“{}{}”.format(1, 2)。在实际项目里f-string 已经是绝对的主流建议优先用它。另外一个技巧是用 repr 函数辅助调试。如果你 print 一个列表显示的结果和字符串有引号时容易看不清细节用 repr 可以显示转义后的内容。这个话题新手很少注意但实际调试时会非常有用。6. 常见问题速查安装坑与思维坑6.1 安装与运行阶段的高频问题第 5 天复盘时我把这 5 天里遇到的所有问题整理成了一个小表里面有不少都是热搜词里的高频内容。问题现象原因解决方法命令行输入 python 提示不是内部或外部命令PATH 未配置按 2.2 节的步骤手动添加 Python 路径到环境变量pip install 时下载慢或超时默认源在国外配置国内镜像源如清华源VSCode 运行时提示未找到解释器没有选择正确的 Python 环境CtrlShiftP执行 Python: Select Interpreter安装包时提示 0x80070643Windows Installer 权限不足右键安装包选择“以管理员身份运行”运行脚本报 ModuleNotFoundError需要的库未安装pip install 对应的库名如 pip install numpy中文输出乱码或写入文件乱码编码未指定读写文件时明确 encodingutf-80x80070643 这个报错我实际遇到过第一次装 Python 时弹出来的。我当时以为是自己操作有问题后来发现就是权限和旧版本残留导致的用管理员身份运行安装包或者先在控制面板卸载掉之前失败的残留版本再重新安装问题就解决了。还有一个看起来不太起眼但是很常见的问题环境变量配置完成后命令行报错说找不到 Python实际上你根本没有重新打开命令行窗口。环境变量只在窗口启动时读取一次改完之后需要关闭旧窗口重开。这个问题特别容易忽略排查了半天结果只是忘了重启终端。6.2 语法与逻辑层面的易错点语法层面的错误我在第 5 天集中踩过的有这么几个。第一个是列表索引越界。Python 的索引从 0 开始最后一个元素的下标是 len(lst) - 1。你想取最后一个元素除了 lst[-1]也可以用 lst[len(lst) - 1]但千万别把条件写错成 len(lst)那就会报 IndexError。负索引是 Python 的一个特色lst[-1] 取最后一个lst[-2] 取倒数第二个这个特性在处理文件行序列时非常方便。第二个是忘记变量之间的深浅拷贝问题。我之前用 list2 list1 这种方式复制列表后来发现改 list2 里的元素时 list1 也被改了。原因和之前邻接矩阵的坑一模一样都是引用传递的问题。正确的复制方式是用切片list2 list1[:]这就是“切片”这个技能在复制场景下的应用。第三个是循环里修改正在遍历的列表。如果你在 for 循环里直接删掉当前元素会导致后面的元素跳过结果非常诡异。安全做法是先用切片复制一份出来遍历再在原来的列表上修改。第四个是函数返回值没有被接收。我写过一个函数函数内部处理了数据但是没有写 return外面用 result my_func() 去接结果是 None。这个问题新手基本都会遇到排查方法也很简单在函数最后加一行 print看看函数内部是否真的执行到了你想 return 的那一行。6.3 一个更隐蔽的思维误区最后想提醒一个思维层面的坑。我自己前 4 天一直有个毛病看到题目就想立刻写代码写完发现不对再一点点改。第 5 天我尝试换了流程先在纸上把问题拆成步骤画出大致的数据流向然后再动笔写代码。同样是写一个去重统计脚本用这个流程之后第一遍运行就通过了。这个改变带来的收益远超我的预期。纸面上的伪代码不需要考虑语法只要逻辑正确翻译成 Python 就是十几分钟的事。如果逻辑本身有漏洞比如漏掉文件为空的情况、忘记处理换行符那么在写代码之前就能发现。一套流程下来“一遍过”的概率大大提升这种正向反馈对初学者的信心帮助特别大。这里我还想分享一个跟学习和记忆相关的小心得别贪多。即使网上有再多的免费 python 源码大全也不如把今天这几个小例子亲手敲一遍、敲懂一遍来的实在。前 4 天我一度想直接找别人的爬虫、量化交易策略代码来模仿后来发现基础不牢那些代码根本读不动更别说改造成自己的东西了。第 5 天当我老老实实从矩阵、切片、文件操作这些小练习做起的时候之前读不懂的很多代码片段突然就能看明白一部分了那种感觉特别爽。我自己现在的习惯是每学一个知识点就立刻想它能用来解决什么现实问题。切片可以处理数组、矩阵是图论的基础、文件读写是数据分析的起点、set 去重是数据清洗的日常操作。把知识点挂到具体的应用场景上比对着教程死记硬背管用得多。如果你也已经学 Python 第 5 天了建议把今天这篇文章里的练习代码都跑一遍尤其是邻接矩阵和李白打酒这两题。跑通之后可以再试着自己改一改把矩阵的大小从 3 改成 5把李白打酒改成“四遇店和花”看看你的循环逻辑还能不能跟上。这比自己盲目刷题要有效得多因为你在主动思考而不是被动接受。此外我在跑“李白打酒”这道题的时候发现用浮点数有坑0.875 看起来是精确的但如果换成“遇店加一倍、见花喝三斗”这种变体浮点数的误差就会显现出来。这时候可以改用分数模块 Fraction例如 from fractions import Fraction先用 Fraction(0, 1) 初始化再一步一步算得到的就是精确分数。这也算是我第 5 天额外学到的一个小知识虽然暂时用得不多但下次遇到财务计算或多步精度问题时肯定能用上。
返回列表