资讯动态

Day4 Python学习:函数、字典、文件读写与记账脚本实战

发布时间:2026/10/14 23:54:04 来源:尧图企业网站定制
如果你和我一样是靠“每天打卡”硬啃编程这条路的看到“Day4 -- Python”这个标题应该立刻能对上号这不是读书笔记不是课程广告就是一个人自学第四天留下的脚印。Python这个语言入门快但第四天往往是最容易出现“我会语法但不会写程序”这种挫败感的节点。前面几天你可能刚把变量、字符串、列表、循环捣鼓明白到第四天突然要面对函数、字典、文件读写再一口气组装成一个小工具情绪基本是兴奋里掺着手忙脚乱。这篇文章我就按自己带人自学和实际写脚本的经验把第四天到底该学什么、怎么练、会踩哪些坑原原本本梳理一遍。适合的人群很明确正在按天打卡学习Python、刚搞定基础语法但还没独立做过程序的零基础同学以及带新人入门的开发者。我尽量把每一步都讲到能照着抄作业的程度代码、命令、执行结果都放在里面你跟着敲一遍当天就能交付一个能跑通的小项目。1. 规划Day4先搞清楚这一天处在哪个位置很多自学朋友会犯一个误区就是拿到一份“XX天学会Python”的课程表按部就班往下走今天学完一个知识点就急着翻页。但任何按天排的学习路线最怕的就是把Day4当独立单元。第四天的价值不在于“多学了几个知识点”而在于它正好是你从“看懂代码”切换到“写出代码”的那道分水岭。1.1 常规前三天大概走到哪一步这里默认的是比较流行的零基础入门节奏。Day1通常是环境安装和基本语法你要能跑通print(hello world)搞明白变量、字符串、数字类型、类型转换知道input()能读取用户输入。Day2会进入条件分支if/elif/else再加上比较运算符和逻辑运算符能写一个猜数字或成绩判断的练习。Day3会学循环for和while配合range()、break、continue还可能会粗浅接触List列表的追加、取值、遍历。按这个进度你手里的武器其实已经很够用了。字符串、整数、浮点数、布尔值这是四种基本数据类型列表能装一组数据if能基于条件做决策for能重复执行一段逻辑。也就是说即便你从没见过函数和字典你也能写出一个完整程序只是会很笨拙所有逻辑堆在一起中间出现一点错误就得从头捋。这也是为什么第四天要引入函数因为它解决的不再是“能不能实现”而是“代码该怎么组织”。如果你用的是其他教程Day4的内容可能略有出入比如第一天就到函数了那也没关系。核心判断标准不变你手里应该已经有一个能在命令行里跑起来的交互式小脚本否则第四天动工之前先回头把前三天的循环和条件补齐。1.2 第四天的核心任务与验收标准我建议第四天不要贪多就盯三件事函数的基本用法、字典的新容器、文本文件的读写。这三样凑在一起能解决大量日常小需求比如记账、打卡、配置管理、日志分析。学完之后你应该能写出一个由main()函数组织入口、通过函数拆分子任务、能把数据保存到文件里、也能从文件里读回来的脚本。验收标准不需要是考试题用项目说话。当天结束前能跑通一个“记账脚本”用户输入收支项和服务金额数据追加保存到本地文件再次运行能读取已有记录做汇总输出比如总收入、总支出、余额。这个小项目覆盖了输入处理、函数拆分、循环、条件判断、字典和列表的组合、文件读写、字符串格式化宽度很够深度也适中。它不是玩具稍微扩展一下就能变成你日常真的会用的脚本。1.3 为什么选择“语言基础小工具”这个组合很多人纠结要不要直接从爬虫或者数据分析开始我自己是不建议零基础在第四天碰这些的。爬虫只要规模一大就会遇到反爬策略、异步请求、数据清洗、存储设计任何一个话题都能把人劝退。数据分析也一样pandas有太多概念第一天拿到DataFrame只会觉得自己什么都不会。Day4的正确姿势是“少学新语法多写小工具”。新语法控制在最小范围把精力花在组装上。同样是学函数单独做一百道练习题远不如在一个记账脚本里把函数用上五六次后者会让你理解参数、返回值、调用关系这些抽象概念到底解决什么问题。工具越小越好最好能在几百行以内写完但要有输入、有处理、有输出形成完整闭环。这样第四天结束你拿出去能说自己“独立完成了一个命令行小应用”而不是“学了第N集课程”。2. 必修点系统拆解函数、字典与文件读写的底层逻辑这天的知识点不建议用死记硬背的方式学每个概念都对应一个“痛点”。函数解决的痛点是代码重复和逻辑难维护字典解决的痛点是列表不好描述复杂对象文件读写解决的痛点是程序一关数据就没了。把痛点想明白语法细节自然好记。2.1 函数从抄写法到封装法的第一课函数在Day4要掌握四个维度定义、调用、参数、返回值。定义用def 函数名(参数):开头函数体缩进调用时写函数名加括号需要传参数就在括号里给参数按位置或按关键字传入返回值用return字面意思就是给调用者一个结果。我见过很多初学者刚接触函数时最难接受的不是“怎么写”而是“为什么要写”。你完全可以把所有代码顺序铺开从上往下跑不引入任何函数。对于一个只有十几行的程序这样没问题。当代码到三十行以上你发现某段逻辑被复制粘贴了三次想改个判断条件得挨个地方改漏一处就出Bug。函数就是用来消除这种重复的。它把一段逻辑命名后收纳起来你需要时就呼它一次。写函数时我建议从“刚才抄写过的代码”开始改不要凭空设计。比如你原来有个循环统计列表里大于3的数字有多少个那就可以把这一段包进def count_big(nums):最后return count。这一步逻辑没有变变的是代码的组织方式。第一次写完你会有种“程序突然能看得懂”的感觉。作用域是第二天的常见雷区。函数内部的变量默认是局部变量函数外访问不到反过来函数内能访问外层变量但如果你想修改外层变量需要用return把新值传回来或者用声明。新手阶段我不推荐用全局变量越界问题后期越改越乱。举个例子total 0 def add_one(): total 1 add_one()这段代码会报错因为函数里对total做赋值Python会把它视为局部变量。正确做法是把总值传进函数、在函数内修改、再返回出来或者用列表、字典这类可变容器承载数据。Day4不必把闭包、装饰器这些进阶概念塞进脑子先把“参数进、结果出”这个流程练熟。参数部分的细节是位置参数、默认参数、关键字参数。这三者不要一起学太多记住默认参数写在非默认参数后面就可以。写个例子说明def greet(name, greeting你好): return f{greeting}{name} print(greet(A同学)) print(greet(A同学, greeting晚上好))第一条输出“你好A同学”第二条输出“晚上好A同学”。默认参数的价值在于让你的函数更灵活却不用每次调用都重复传值。需要提醒的是默认参数尽量不要设为可变对象比如不要写def f(items[])因为默认列表会被多次调用共享这是一个经典坑点后面排查实录里我会专门说。2.2 列表与字典组合使用才能描述现实数据前面你已经学过列表它适合保存一组有序的数据[苹果, 香蕉, 橘子]。列表的问题是每个位置上的元素语义不明确如果记账只用列表你可能会写成[饭, 30]这样的结构时间一长根本分不清哪个元素是金额、哪个是备注。字典就是来解决这个问题的它用键值对存储数据键相当于字段名。expense {item: 午餐, amount: 30, type: 支出}这个结构一目了然。更常用的是把多个字典放进一个列表形成一组记录。字典列表非常接近你以后在JSON、数据库表、Excel表格里看到的数据形态Day4必须把这种组合用法练熟。读字典要注意两种取值方式。expense[item]在键不存在时会抛KeyErrorexpense.get(item)不存在时返回None也可以指定默认值。新手阶段优先学get因为它不会让程序中断。遍历字典可以用.keys()、.values()、.items()其中最常用的是.items()它能同时拿到键和值for key, value in expense.items(): print(key, value)实际项目中我经常看到新人把“多条记录”用多个变量存比如record1、record2这样一路命名到record99这显然是错误的建模方式。凡是一组同类数据统一放进列表凡是描述一条数据的多个维度统一用字典。列表管“多”字典管“字段”组合起来就是一套完整的数据结构。Day4还要顺手掌握append添加记录、sorted按关键字排序、max和min取极值这类常见操作。比如统计最大一笔支出max_expense max(records, keylambda r: r[amount])lambda可以先不深入了解知道它的作用是用一个表达式作为排序或取极值的依据就好。实在觉得抽象自己写一个比较循环也能达到同样的效果但用key参数明显更简练。2.3 文件读写给程序加上长期记忆前面几天你写的程序跑完就结束了数据只在内存里。只要关掉终端一切归零。文件读写就是解决持久化问题的。Day4只要掌握纯文本文件读写就够JSON和数据库可以放后面。写文件的代码很简单with open(记录.txt, w, encodingutf-8) as f: f.write(今天学了Python\n)w模式会覆盖原文件a模式追加不会覆盖。读文件常用read读整个文本或用readlines按行读取列表。需要注意三点文件路径最好用相对路径放在当前目录encodingutf-8对中文内容必不可少用with open自动管理关闭避免忘写f.close()。如果你不是按行存文本而是存结构化数据我强烈建议直接学一点JSON。JSON格式本身就是Python字典和列表的文本形态读出来用json.loads就能还原成Python对象比手工解析字符串靠谱太多。Day4的项目里我建议先用纯文本保存简单直观等跑通之后再试试用JSON模块替换存储逻辑代码改动不超过二十行。一个常见的错误是忘记把读到的文本转类型。文件里读到的永远是字符串你想拿它做求和运算必须先int()或float()转换。很多新手明明文件里写了一行“12”用的时候突然报“字符串不能和数字相加”多半就是没做类型转换。2.4 组织脚本入口if __name__ __main__到这里你可能会把练习代码随口写在文件顶层从上到下执行。这在单脚本阶段不算大问题但学习之日起就写if __name__ __main__:会省掉以后重构的麻烦。这个语句的作用其实很朴实当Python文件被直接运行时__name__的值是__main__当它被另一个模块导入时__name__的值是模块名。把执行入口放到这个条件里就保证了“直接运行才干活被导入时不执行”。日常脚本大可不必纠结“模块导入”这种抽象的表述。比较直观的理解是养成把“主流程”放在函数里然后由main()呼入口的习惯。结构上形成“导入库 – 定义工具函数 – 定义main函数 – 主入口调用”的四层结构这份代码的可读性会远超一大段顺序代码。后面记账脚本就是按这个规范写的你可以直接套用。3. 实操把第四天的知识拼成一个记账脚本不跑项目今天学的函数、字典、文件读写就是散装零件。下面我给出一个完整脚本功能是用户在命令行里输入收支类型、项目名、金额程序把它追加到本地文件再输入特定命令时能读取全部分类求和并输出汇总。这个脚本麻雀虽小五脏俱全我一步步拆开讲。3.1 确认前期准备与实现思路动手前先确认Python已经能在终端正常运行命令行输入python --version能输出版本号。然后建一个空目录比如day4_expense在里面新建expense.py。目录名随意但建议以后每一个小项目单独建目录不要把所有练习都堆在一个文件夹里方便回溯和删除。思路先想清楚程序要维护一组记录每条记录有item和amount两个字段记录之间还要区分收入或支出。那我用一个字典来表示一条记录{item: 午餐, amount: 30, type: 支出}。所有记录放在列表里。文件存储时最土的方案是每行写一种文本例如支出,午餐,30。读文件时再按逗号拆分还原成字典。这个方案能验证你对列表、字典、字符串分割的理解等跑通后在替换为提高JSON。3.2 代码实现与逐行解读完整代码如下建议你自己新建文件敲一遍不要复制粘贴import json import os DATA_FILE accounts.json def load_records(): if not os.path.exists(DATA_FILE): return [] with open(DATA_FILE, r, encodingutf-8) as f: return json.load(f) def save_records(records): with open(DATA_FILE, w, encodingutf-8) as f: json.dump(records, f, ensure_asciiFalse, indent2) def add_record(records, record_type, item, amount): record { type: record_type, item: item, amount: amount, } records.append(record) return records def build_summary(records): income 0 expense 0 for r in records: if r[type] 收入: income r[amount] elif r[type] 支出: expense r[amount] return income, expense def main(): records load_records() while True: print(\n请选择操作1. 记账 2. 查看汇总 3. 退出) choice input(输入序号).strip() if choice 1: record_type input(类型收入/支出).strip() item input(项目名称).strip() amount float(input(金额).strip()) records add_record(records, record_type, item, amount) save_records(records) print(记账完成) elif choice 2: income, expense build_summary(records) balance income - expense print(f总收入{income:.2f}) print(f总支出{expense:.2f}) print(f余额{balance:.2f}) elif choice 3: print(再见) break else: print(输入无效请重试) if __name__ __main__: main()代码结构可以对照前面说的四层顺序导入库、定义工具函数、定义入口、最后调用。load_records负责将来读取JSON数组文件不存在时返回空列表。save_records把列表写回JSON文件ensure_asciiFalse避免中文落盘变成\uXXXX转义。record_type和amount作为参数传入这样函数只干一件事方便后续加“统计某分类”的功能时能复用。build_summary用循环遍历所有记录按类型累加。这里注意一点输入金额后我用float()做了转换如果用户输入两个单词或空字符串程序会直接抛异常。这个问题留到下一节排查实录里专门处理。main里用死循环配合序号选择这是命令行交互脚本最基础的写法练习完全够用以后学GUI或Web时自然会替换成按钮和路由。3.3 执行脚本并验证数据落盘保存文件后在终端执行python expense.py运行后会看到操作菜单。依次操作请选择操作1. 记账 2. 查看汇总 3. 退出 输入序号1 类型收入/支出收入 项目名称兼职 金额200 记账完成再试两笔支出然后选2查看汇总预期输出总收入200.00 总支出68.50 余额131.50退出后打开同目录下的accounts.json你会看到类似[ { type: 收入, item: 兼职, amount: 200.0 }, { type: 支出, item: 午餐, amount: 23.5 } ]看到这个JSON文件说明今天的知识点全部串起来了程序没有退出而丢失数据说明文件读写和JSON序列化生效了。再跑一次程序选择查看汇总数据依然还在这就是持久化的意义。如果你想让项目更像样可以再追加一个“删除某条记录”或“按月统计”的功能。删除记录用列表推导式可以写成records [r for r in records if 条件]这是第四天能理解的一种简写方式。按月统计则需要学会datetime模块和把时间字段加入每条记录作为Day5的预习也合适。4. 报错与排查实录第四天最容易翻车的四个地方这一节我按自己带人学Python时真实的翻车顺序来写。不是存在概念里的反例而是每一位刚写第四天脚本的人几乎都会遇到的实际报错。遇到就翻这里对照模型解决一遍很多坑就不会再犯。4.1 缩进错误IndentationError: expected an indented block这是新人的头号杀手。Python用缩进表示代码块不像C语言有花括号。解决方案是两个维度一是统一用4空格不要在IDE里设置Tab二是如果遇到expected an indented block错因通常是if、for、def下面空着没写内容或者说下面代码没有缩进。新手可以在IDE里开启“显示空格/制表符”选项一眼就能看出来哪里混用了。我个人的习惯是把工具的“Tab键行为”设置为插入4个空格。这样按Tab键不会真正输入一个Tab字符从源头上根除混合缩进问题。一旦出现混用排查思路不是找具体某一行而是全选代码重新统一缩进。老手也踩过“看着缩进正常但实际是Tab”的坑所以别相信肉眼用编辑器设置比肉眼可靠。4.2 函数改不动外层列表的尴尬看这段代码def add_item(items, item): items.append(item) my_list [] add_item(my_list, 苹果) print(my_list) # [苹果]这会正常修改my_list因为列表是可变对象你传进去的是同一个列表的引用。这本质上不算错误但很多人学到这里开始飘把“函数能改外面列表”这条经验用错场景以为所有数据结构都能这样被函数直接修改。当你尝试def add_one(num): num 1再传入整数时外层整数不会变因为整数是不可变对象。Day4不需要背“可变与不可变”的全部细节但至少要知道函数里修改传入的列表、字典会影响到外层修改数字和字符串不会。于是你会明白记账脚本里add_record返回records是多此一举吗并不是返回列表让代码更清晰同时符合“输入输出明确”的原则在不熟悉的场景下更安全。4.3 输入字符串没有转数字的坑input()读到的永远是字符串。如果你写if choice 3:Python会把它当成字符串比较结果完全不对。更典型的是计算amount input(金额) total amount 10 # TypeError: can only concatenate str这里amount是字符串不能和整数直接相加。报错会提醒你类型错误但报错位置有时不在你预期的地方。解决方法是输入后立刻转换amount float(input(金额).strip())。还可以加一个异常处理防止用户输入“abc”导致程序崩溃while True: raw input(金额).strip() try: amount float(raw) break except ValueError: print(金额必须是数字请重新输入)try/except在这个年级不算超纲属于第四天可以顺手带过的常用防护。等你写命令行工具给真实用户用时输入校验必须做否则随便一个手滑输入就会让工具半路夭折。4.4 文件编码和JSON的中文显示问题用文本方式保存中文写入时的encodingutf-8不能省。如果省略Windows下默认编码可能不是UTF-8后续用其他工具打开文件就乱码。保存JSON时json.dump(records, f, ensure_asciiFalse, indent2)中的ensure_asciiFalse同样关键它让中文正常写入文件而不是变成\u4e2d\u6587这种转义序列。另一个高频问题是读取时忘了文件不存在像我前面写的load_records一样先os.path.exists判断就是标准姿势。还有一点很多人会忽略用Excel打开JSON文件往往显示不了内容因为Excel不原生支持JSON格式。不要因此认为数据写坏了。想知道写没写好用文本编辑器或cat命令看内容即可。想用Excel看不如把人学一遍用csv模块但那又是另一种格式的语法Day4可以不用学知道有这么回事就好。4.5 函数默认值为空列表的陷阱我前面提到过def f(items[]):是个坑。看具体例子def add_todo(item, todo_list[]): todo_list.append(item) return todo_list print(add_todo(写代码)) # [写代码] print(add_todo(再读一章)) # [写代码, 再读一章]第二次调用没有传列表但你期望“新建一个空列表”结果发现上一次调用的结果还在。原因是默认列表只在函数定义时创建一次之后所有调用共享同一个列表。这不是Python的缺陷是初学者最容易踩的经典陷阱。避免方法很简单默认参数永远不要写成空列表或空字典真需要空容器就用None然后判断def add_todo(item, todo_listNone): if todo_list is None: todo_list [] todo_list.append(item) return todo_list第四天刚开始写函数遇到这个坑的时机刚刚好因为它能帮你记住“默认参数值在定义阶段一次性完成求值”这个隐蔽机制。5. 把Day4的成果扩展成真正日常可用的工具如果你今天把记账脚本跑完了试着别急着跳到Day5。第四天最大的学习红利在于你已经有了一个“输入–处理–持久化–输出”的完整模板几乎所有命令行小工具都可以照着这个骨架扩展。下面给出三条不同方向的扩展思路选一个顺手填点代码学习效果会比看十节课还强。5.1 方向一换数据源从手输变成批量处理文件把“用户手动输入一条记录”改成“程序自动读取一份表格文件”你会发现记账脚本变成了一个数据清洗工具。比如有一个订单明细几行文字每行格式是“日期,项目,金额”。你可以用readlines逐行读取、按逗号分割、提取字段再统计总额。这个扩展需要用到字符串.split()方法这是Day4完全可以接受的难度。做完之后你对“批量处理文件”的理解会建立起来因为很多自动化脚本的本质就是从文件里读入数据按规则变换再写回文件。我建议你在扩展时保留原有函数不要重写整个脚本。比如build_summary已经能接收任意记录列表只要把从文件读取的解析结果转换成和之前一致的字典列表就能直接调用它。这就是函数拆分的价值数据来源变化了但处理逻辑复用。5.2 方向二加时间维度变成月度账单在每条记录里加入日期字段这是把脚本从“演示工具”变成“实用工具”的关键一步。你需要学一点点datetime模块特别是datetime.now()和字符串格式化。然后build_summary可以扩展成按月份分组。用Day4的知识是完全够的分组思路也很朴素先取日期字符串前7个字符作为月份键再用一个字典把所有同月份的金额累计比如month_summary {月份: 总金额}。这个扩展让你第一次真正用到“字典作为分组统计容器”这个常见模式。以后无论遇到什么“按省份统计销量”“按日期统计访问量”思路和这完全一样。四天学会这个模式性价比很高。5.3 方向三给程序加一个中文菜单的过期优化如果你不想学新模块想尽量少写代码那就打磨交互环节。比如把用户输入的序号校验放到独立函数里把金额解析放到独立函数里让main函数变得肉眼的干净。有人会觉得“代码本身能跑就行”但对零基础到第四天的人来说重构就是最好的复习。你会在不动功能的前提下审视自己的代码结构你会注意到函数命名是否清晰、变量名是否一看就懂、缩进是否整洁。我把这个过程叫“给代码洗脸”做完之后再看原来的脚本会有一种“这是我写的吗”的感叹。等你把代码洗脸做完了你手里就已经有一份可以发给别人用的脚本模板。下一次不管遇到什么小需求比如批量重命名文件、统计日志中出现频次最高的词、合并几个文本文件你都可以照着这个模板快速搭出雏形。这正是Python作为题材工具的真实威力也是Day4真正想让你养成的能力。5.4 一个重要的心态提醒第四天最忌讳的就是“资料囤积症”。某网盘里存了几十个视频账号里买了好几门课收藏夹里码了一堆入门文章但自己动手写代码不到两小时。我见过太多人把时间花在“找最好的教程”上却不在一个最简单的项目上磨上一晚上。既然你今天是Day4就把手机放到另一个房间关掉社交软件打开编辑器就做一件事把这篇文章里的记账脚本从零手敲一遍。一个字母一个字母敲不要复制。敲的过程中你会遇到报错然后回文章里查原因解决再继续。这比你看二十遍教学视频有效得多。这个过程虽然磨人但那是真正属于你自己的经验。到了晚上你在终端里看到自己跑通的汇总数据那才叫Day4完成。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑