Python 函数与模块:建立可测试的订单规则|课后复习

课堂课件 · 课前原始判断 · 本周导学

今天学会了什么

能把重复订单逻辑提取为有合同的函数和模块,用相同输入、输出及状态断言证明重构没有改变业务。

实参、函数执行与返回调用处

从调用处沿图解释实参怎样交给形参、局部计算何时结束、返回值交给谁,并指出可能修改外部对象的位置。

今天讲了什么(对照复习)

下面逐项对应课堂正文。先盖住右边那一栏,凭记忆回答;卡住了再翻回左边同名的小节。光说得出名字不算会,还要能讲清它会做什么、什么时候会失效。

课堂对应章节必须能解释的机制与边界
先让旧办法真实失败;满足这些要求的方法叫函数;从重复金额块提取第一个函数重复规则会造成漏改;按可复用、可独立验证的职责提取 def,而非按行数拆文件。定义不会执行函数体,调用才执行,规则只有一个可信实现位置。
动结构前,先冻结正确行为;重构循环:一次只提取一个职责先确认旧行为正确,保留正常、错误、状态不变的基线。重构保持可观察行为;每次只提取一处,读 diff 并重跑同一批输入。
参数:调用者必须提供什么;return、print 和 None实参传给形参;位置参数依赖顺序,关键字参数明确含义。只传函数所需数据;print 面向人,return 面向调用者,未显式返回得到 None。
局部变量、外部名称和作用域;可变参数:传入字典后,函数可能改到原对象局部赋值不自动覆盖外部同名变量;修改传入字典的内容却会影响原对象。优先显式参数,避免 global 隐藏依赖。
从第一个函数继续形成函数合同;中文 docstring 写什么;先纯规则,后受控状态动作合同写职责、参数类型和单位、返回、异常、允许的副作用及非职责。纯计算/查询不改输入;支付/取消是受控副作用,先校验再修改。docstring 说明规则和边界。
断言:把预期写成可运行检查assert 对比实际与预期,覆盖金额、资源、状态和失败无半更新;开发断言不替代用户输入校验,也不能把原来错误的结果冻结成标准。
模块、包和入口副作用模块通过 import 复用,依赖方向要清楚;用 main 保护交互入口,导入不创建订单、不读键盘。循环导入先画依赖图,再纠正职责。
同步调用:先看清函数什么时候返回普通调用要等被调函数返回,调用方才继续使用结果;这描述顺序,不说明耗时。同步返回基础将用于 W02 理解异步等待。

出了问题:怎么发现、怎么修、怎么验证

只在你自己那份课程副本或专用实验数据上复验,把改之前和改之后的真实结果都留下来。

风险/现象提前预防怎样发现怎样处理怎样复验
只 print 导致调用者得到 None写明返回值合同直接检查函数返回类型与金额返回业务值,将显示放调用方断言结果而非只看终端文字
隐藏全局状态或误改参数标明可变对象和允许副作用同一输入重复调用,比较调用前后对象改成显式参数,收紧状态修改入口计算不改原值,合法动作才改变状态
导入弹菜单或循环导入模块职责单向,交互放 main单独 import,观察是否等待输入或报初始化错误加入口保护并修正依赖方向导入立即返回,直接运行仍可使用
重构时混入业务变化先冻结正确基线,一次提取一处对照相同输入、返回和状态的旧新结果分开规则变更与结构改动目标断言和全部旧断言均通过

闭卷自测

先自己答一遍,再去运行或翻回课堂核对;不确定的地方标出来,别用 AI 的答案顶掉你自己的第一次判断。

  1. 写出金额函数的最小合同:输入、输出、单位、失败与副作用。为什么不传整个订单仓库?
  2. 函数里重新给参数赋值与修改参数字典的键,有什么可观察差别?
  3. 只打印金额却不 return,会让调用方拿到什么?普通调用结束后从哪里继续执行?
  4. 导入规则模块会要求输入订单,应该从哪个边界修复?模块相互导入时先画什么图?
  5. 把数量限制的个人变化与重构分成两次修改,各自如何定义验收?

再看一眼真实业务

预习能观察到单笔和批量入口,却看不到平台源代码。用自己的函数调用图解释怎样让两个入口共享规则,写成设计建议,不写成对平台实现的结论。

今天留下什么,下节课怎么接着用

保留规则函数库、docstring、模块调用图、重构前后同输入对照、assert 检查和独立变更 diff。W01-D04 在这些边界上建立模型与 JSON 转换。

今天用普通 assert 建立回归,W01-D05 统一接入 pytest;装饰器实现与 async 语法不作为今天新增必做。

本次商城补强怎样复验

新增机制商城用途防错与复验
默认值/None订单备注连续省略参数不共享;显式共享须说明
闭包与高阶函数满减试算两活动交替调用、门槛两侧运行
*args/**kwargs与类型提示调用参数约定展开只传参,注解不做业务校验
lambda方案按金额排序单表达式无副作用,复杂规则仍用def

逐项留下原输入、错误现象、最小修复和再次运行结果。若未运行,不写“问题已解决”。