
打卡Python王者归来第5天今天是我的Python学习打卡第5天。老实说前4天走得有点跌跌撞撞从完全接触编程到能写出简单的条件判断和循环中间无数次想放弃又捡起来。但真正让我感觉到入门了的恰恰是这第5天——因为我开始理解函数和数据结构这两个概念恰好是编程里最核心、也最值得花时间啃的骨头。如果你也在学Python或者正卡在某个阶段不知道该往哪使劲这篇第5天的打卡记录也许能给到你一些方向。我会把这一天的学习内容拆得很细学了什么、为什么这么学、怎么练最有效以及我踩过的坑。不是给你灌鸡汤而是真实复盘这一天的得与失。1. 第5天在整条学习路线中的定位1.1 为什么前4天那么“碎”前4天我干了什么无非是第1天装环境、跑通Hello World第2天认识变量和基本数据类型第3天写if条件判断第4天折腾for和while循环。看起来零散但这些其实是Python的砖块。没有这几天的底子今天的内容根本接不住。到了第5天学习重心从单条语句能干什么上升到了怎么把语句组织起来复用、怎么在内存里批量管理数据。如果说前4天是在认识单个汉字第5天就是开始学组词造句。函数解决的是动作的封装列表和字典解决的是数据的收纳。这两个东西一旦掌握了基本上就能写出有点逻辑的程序了不再是纯粹一行行执行。我个人的感受是第5天是一个分水岭。能不能坚持下去往往取决于这一天之后你有没有一种我好像能写点小工具了的感觉。因为函数和数据结构的学习成果非常看得见写一个函数调用它输出结果建一个列表循环处理里面的每个元素——这种反馈比枯燥的语法练习强太多。1.2 这一天到底该达成什么目标学习最忌讳漫无目的。我在开始第5天之前给自己定了三个必须达成的目标第一能独立写一个带参数和返回值的函数并且理解参数怎么传、返回值怎么接。不是照着抄而是能自己设计一个小功能把它封装成函数。第二弄懂列表和字典的增删改查知道在什么场景下用列表、什么场景下用字典。这一步特别关键因为很多人学完语法但写程序时不知道选哪个容器导致代码又臭又长。第三通过做一个综合小练习把函数和数据结构串起来用。这也是检验前面学的if和循环是不是真的掌握了的好机会。定目标是必要的否则一天学下来看似看了很多资料实际上脑子里还是一团浆糊。我在前几天的打卡里吃过这个亏——视频跟着看完了语法跟着敲完了关上电脑什么都写不出来。2. 函数从抄代码到写代码的关键一步2.1 先理解函数是干嘛的大多数教程上来就讲函数定义、参数、返回值初学者容易陷入语法细节里出不来。我的理解方式是先想一个问题为什么需要函数比如我要计算一个长方形的面积。一次两次直接写width * height就行了。但如果我在程序里20个地方都要算面积呢每个地方都写一遍那不仅累而且万一以后面积公式要加上什么系数你还得一个一个去改。函数就是把这一小块逻辑装进一个盒子里给它起个名字需要的时候喊它一声。这个类比特别适合初学者理解函数像一台果汁机。你把水果放进去参数按键启动调用出来的是果汁返回值。不用关心果汁机内部怎么运转的你只要知道输入什么、输出什么、怎么触发就行。了解了意义再去看语法就顺多了。Python里定义一个函数用def关键字后面跟函数名、括号和冒号。函数体要缩进最后用return把结果送出来。比如def calculate_area(width, height): area width * height return area这个函数接收两个参数计算面积后返回结果。调用的时候result calculate_area(5, 3)得到15。2.2 参数传递里的那些坑说实话参数这部分我前两次打卡都没彻底搞明白今天是真懂了。核心要分清形参和实参。形参是定义函数时写在括号里的变量名比如上面例子里的width和height实参是真正调用时传进去的值比如5和3。函数在运行时把实参的值绑定到形参上然后执行函数体。这个关系理清了很多报错就能看懂了。还有一个常见知识点是位置参数和关键字参数。位置参数就是按顺序传参第一个值给第一个形参第二个给第二个。关键字参数是调用时指名道姓地传calculate_area(width5, height3)这样即使顺序反了也没关系。更灵活的是可以在函数定义时设置默认值def greet(name, greetingHello): return f{greeting}, {name}!如果调用greet(小明)输出Hello, 小明!如果调用greet(小明, Hi)则输出Hi, 小明!。这个特性特别实用尤其是函数有很多可选配置的时候。不过要注意带默认值的参数要放在没有默认值的参数后面否则会报语法错误。这是Python的规定原因是为了避免调用时的歧义。2.3 返回值不是必须的但设计好很重要不少初学者以为函数必须写return。其实不是函数完全可以没有返回值。比如我只想打印一段信息不需要拿结果做什么那就不需要return。但这种函数执行完会返回None这也是一个很容易让人困惑的点。def show_info(name): print(f当前用户是{name})调用它时打印正常但如果你写result show_info(张三)然后打印result会看到None。这是正常的不需要慌。更值得留心的是return的另一个作用一旦执行到return函数就结束了后面的代码不会继续跑。所以如果有提前返回的逻辑比如参数不合法就直接返回可以用这个特性def safe_divide(a, b): if b 0: return 除数不能为零 return a / b这样代码既简洁又安全。我当时学到这里对return既是返回值也是退出标记这个双重身份印象特别深因为之前总觉得函数只能有一种写法。3. 数据结构列表和字典的实战选择3.1 列表有序的“收纳盒”列表是我觉得最贴近日常思维的容器。它就像一条有序的储物柜每个格子都有自己的编号下标从0开始数。你可以往里面加东西、取东西、改东西、删东西还能一口气遍历所有格子。创建列表有两种常用方式fruits [苹果, 香蕉, 橙子] numbers list(range(1, 6))访问元素用下标fruits[0]是苹果。修改fruits[1] 西瓜。追加元素用append()方法删除可以remove()按值删也可以用pop()按索引删。遍历列表推荐用for循环直接拿元素for fruit in fruits: print(fruit)这种方式最直观不需要关心下标。如果确实需要下标可以用enumerate()for index, fruit in enumerate(fruits): print(index, fruit)3.2 字典按照名字找东西列表适合按顺序存放数据但如果你要根据某个属性快速查找信息字典更合适。字典是键值对的集合像一本通讯录——你输入一个名字键立刻就能得到电话号码值。创建字典student { name: 小明, age: 18, city: 上海 }取值student[name]得到小明。修改student[age] 19。新增键值对student[score] 90。删除del student[city]。有一点值得提醒从字典里取一个不存在的键会直接报KeyError。所以更安全的做法是用get()方法score student.get(score, 0)如果键不存在返回默认值0而不是报错。这在处理不确定数据时非常实用。3.3 什么时候用列表什么时候用字典这是新手最常纠结的问题。我的判断标准很简单如果数据是有顺序的一串同类事物用列表如果需要根据某个标识快速找到对应信息用字典。比如记录一周每天的体温就用列表因为顺序有意义但要记录每个学生的成绩用字典更好因为你是通过学生姓名查成绩而不是一个个翻列表。列表和字典还能嵌套使用。比如一个列表里装多个字典students [ {name: 小明, score: 88}, {name: 小红, score: 95}, {name: 小刚, score: 76} ]然后配合循环就能批量处理数据。这一招在很多实战项目里是标配学会了基本就能应对大部分数据组织的场景了。4. 实操练习把函数和数据结构串起来4.1 设计一个练习学生成绩管理小工具学完知识点不等于会用了所以我给自己安排了一个综合练习。目标是写一个简单的学生成绩管理工具支持三个功能录入成绩、查看平均分、查看最高分和最低分。这个练习的好处在于它把第5天学的函数和列表字典全用上了同时还复习了循环和条件判断。综合训练效果比做一堆碎片化的选择题强得多。先定数据结构用一个列表students存储所有学生信息每个学生是一个字典包含姓名和成绩。students [] def add_student(name, score): student {name: name, score: score} students.append(student) print(f已录入 {name} 的成绩{score})添加函数很简单关键是调用几次以后students列表里就攒了好几个字典。然后写统计函数def calculate_stats(): if len(students) 0: print(暂无数据请先录入成绩) return scores [s[score] for s in students] average sum(scores) / len(scores) highest max(scores) lowest min(scores) print(f平均分{average:.2f}) print(f最高分{highest}) print(f最低分{lowest})这里用了一个列表推导式s[score] for s in students这是Python里很常见的写法——从列表里的每个字典中取出score值生成一个新列表。当时我刚看到这个语法时觉得有点绕但练了两遍就顺手了因为它其实就是在说对students里的每个人把他的分数拿出来。4.2 让程序“活”起来加入交互循环静态的数据录入没什么意思更接近真实场景的是一个可以反复操作的命令行菜单。所以我加了一个while循环让用户选择做什么while True: print(\n1. 录入成绩) print(2. 查看统计) print(3. 退出) choice input(请选择操作) if choice 1: name input(输入姓名) score float(input(输入成绩)) add_student(name, score) elif choice 2: calculate_stats() elif choice 3: print(已退出再见) break else: print(无效选项请重新输入)这个循环把这个小工具变成了一个能跑的系统。虽然还很简陋但用户真的可以在命令行里录入多个学生、查看统计结果然后退出。写完之后我第一次有了一种我会编程了的感觉不是说大话而是这种即时反馈确实很能增强信心。做完这个练习我建议你也模仿着做但不要直接抄代码。把功能需求自己理一遍数据结构自己定函数自己写哪怕慢一点也值得。编程能力是写出来的不是看出来的。5. 常见问题与排错心得5.1 缩进错误是最“容易”犯的错Python对缩进要求极其严格。一个IndentationError: expected an indented block就能让新手抓狂半天。我的经验是函数体、循环体、条件体里的代码统一用4个空格缩进不要混用Tab和空格。编辑器最好设置为Tab自动转4空格这样省去很多麻烦。另外空函数如果还没想好怎么写可以用pass占位否则会因为函数体不能为空报错def future_func(): pass5.2 变量作用域引发的奇怪现象我第5天遇到一个很典型的问题函数内部修改了变量函数外面打印却还是老样子。后来才明白这是局部变量和全局变量的区别。简单说函数内部赋值的变量默认是局部变量函数执行完就被销毁了不影响外面的同名变量。如果确实需要在函数里修改全局变量需要用global声明——但我的建议是尽量少用global因为会让代码难以追踪。更好的办法是让函数通过参数接收数据再通过返回值把结果带出来。这样数据流向清晰代码更好维护。我在练习里的add_student函数就是例子它通过append()修改了外面的students列表但没有重新赋值所以不需要global也能生效。这里有一个微妙但很重要的区别修改对象本身不需要global重新绑定变量名才需要。5.3 类型错误浮点数与字符串混用录入成绩的时候我一开始用input()直接接收然后存进字典。后来算平均分的时候发现sum(scores)报错。原因很简单input()返回的是字符串比如88而计算平均值需要数字类型。解决办法是前面代码里写的score float(input(输入成绩))把字符串转成浮点数再存。这个坑非常典型几乎每个初学者都会踩。记住一个原则从input()拿到的永远是字符串需要数值计算必须先转换。5.4 调试技巧不要急着改代码先打印我学到一个特别有用的调试思路程序报错了或者结果不对不要凭感觉乱改。先在关键位置加上print()把中间过程打出来看看。比如算平均分之前我先打印一下scores是什么是不是预期的[88, 95, 76]这样的列表。如果列表不对再往前查找到是录入环节出了问题还是取数环节出了问题。这种变量可视化的调试方法比盯着代码发呆高效太多了。等确认逻辑正确后再把这些调试用的print()删掉保持代码干净。这一步我每次都会做算是一点点职业习惯。6. 第5天打卡给我带来的三个收获学完这一天我最大的体会是Python的学习曲线其实是先缓后陡再缓。前4天是缓坡每天学点貌似简单的东西第5天突然变陡因为函数和数据结构把前面的知识真正串联起来了。但只要咬牙翻过这个陡坡视野一下子就开阔了。第二个收获是我现在敢于自己造轮子了。虽然是很简陋的小工具但那种从零构思一个功能、自己拆解、自己实现的过程才是编程真正的乐趣所在。抄一百段代码不如自己写一个能跑的小程序。第三个收获是我越来越明白学习编程的唯一方式就是编程这句话了。看视频、翻教程都只是输入只有动手写才形成输出循环。第5天我花在写代码和排错上的时间比看资料的时间多得多效果确实验证了这一点。如果你也正在学习Python的第5天、第6天甚至更晚的阶段我想说的是别急着往前赶把函数和数据结构这些地基打牢。后面学的文件操作、类、第三方库全都建立在这些核心概念之上。地基松了越往上盖越心虚。明天我会继续打卡第6天计划学文件读写和异常处理。到时候如果遇到有意思的坑再回来跟你分享。这次就到这里我要去把今天的练习再重构一遍了——因为我又想到了一个更好的数据组织方式。