周报

学习内容:本周进入函数与数据结构的阶段,重点是把前两周的代码“组织起来”。函数部分学习了 def 定义、位置参数与关键字参数、默认参数、return 返回值与多返回值、局部变量与全局变量的作用域区别,以及 global 声明的使用场景。数据结构部分系统学习了列表(索引、切片、append/insert/remove/pop/sort/reverse、len/sum/max/min)和字典(键值对、get() 取值、items() 遍历、键的唯一性),并初步接触列表推导式和字典推导式的写法。此外还学习了模块的概念,练习用 import math、from random import randint 调用标准库。
实操完成:① 把第3周的分数等级判定封装成 get_grade(score) 函数,再扩展为接收分数列表的 count_grades(scores),返回各等级人数组成的字典,体会“函数把重复逻辑收进名字里”的好处;② 用字典实现简易通讯录,支持添加、按姓名查询、删除和列出全部联系人,查询用 get(name, "未找到") 避免 KeyError;③ 用列表推导式完成 1~100 中偶数的平方和,并与传统 for 循环版本对比代码行数;④ 用 random 模块写了一个猜数字小游戏,练习“循环+分支+函数”的组合。
收获:最大的体会是函数让改动成本大幅下降——原来逻辑散落在各处,需求一变就要逐处修改,封装之后只改函数体一处即可。数据结构的选用同样影响巨大:通讯录如果用两个平行列表实现,查询和删除都要同步维护下标,换成字典后一次键查找就完成,代码量少了一半,也不容易出错。列表推导式初看不太习惯,但写熟之后明显比循环更贴近“我要什么”的表达方式。另外 return 可以一次返回多个值(本质是元组),省去了定义输出参数的麻烦。
问题与解决:遇到了可变对象作为默认参数的坑——def add(item, lst=[]) 多次调用时列表会累积上一次的数据,排查后才明白默认参数只在函数定义时求值一次,所有调用共享同一个列表对象,改成 lst=None 后在函数体内判断再创建空列表即可。另外还犯过一次在函数内部给全局变量赋值却没有 global 声明,导致报 UnboundLocalError,通过打印和逐步缩小范围定位到问题。

posted @ 2026-11-10 18:16  Outliery  阅读(3)  评论(0)    收藏  举报