Python 业务规则:条件、循环、容器与异常|课后复习
今天学会了什么
能把数量、商品与状态规则写成明确分支,逐条处理一组记录,记录失败并保持未成功业务的状态不变。
顺着这张图,把成功和失败两条路各走一遍,再画出批量循环中一条失败记录从哪里退出,哪些金额和状态没有被更新。
今天讲了什么(对照复习)
下面逐项对应课堂正文。先盖住右边那一栏,凭记忆回答;卡住了再翻回左边同名的小节。光说得出名字不算会,还要能讲清它会做什么、什么时候会失效。
| 课堂对应章节 | 必须能解释的机制与边界 |
|---|---|
| 先把自然语言规则写成判定顺序;状态迁移:先检查,再一次更新 | 先解析输入,再校验范围、商品与当前状态,成功后才累计或更新。当前课程允许待付款→已付款/已取消;拒绝已付款取消和已取消付款,失败保留原状态。平台完整退款规则不在今天实现。 |
| 比较表达式得到 bool;and、or、not 与真值表 | = 与 不同;比较返回真假,字符串大小不等于整数大小。and 要两侧满足,or 要至少一侧满足;action “pay” or “cancel” 的右侧是非空字符串,不能表达两个比较。 |
| 短路求值:为什么条件顺序会影响安全;if / elif / else 是按顺序选择路径 | 短路会跳过不必求值的一侧;具体条件与宽条件的顺序会改变命中分支。先走真值路径再改代码,避免把所有校验挤入一个长表达式。 |
| 输入转换和异常边界;真值不等于业务合法 | 只在可预期转换边界捕获 ValueError,失败后不继续使用无效值;不要用 except Exception 吞掉程序缺陷。负数也是真值;bool 在 Python 中与 int 有继承关系,业务数量仍须显式拒绝布尔值。 |
| 列表:保存有顺序的一组记录;字典:用键表达一条业务记录;容器可变:两个名称可能指向同一个对象 | list 保存记录顺序,dict 表达字段;索引越界为 IndexError,缺键为 KeyError。append 原地修改且返回 None;get 的默认值不等于补齐必填字段。赋值给另一名称只是别名,嵌套可变对象需检查共享关系。 |
| for 循环:按顺序取出每个元素;循环的四个观察点;累计:读取旧值,再写入新值 | 识别初始化、本轮取值、条件更新和出口;计数、结果列表、Decimal 总额在循环前初始化。enumerate 提供轮次,range 提供整数序列;先校验本轮,再更新累计。 |
| continue 与 break:业务策略不同 | continue 跳过本轮余下语句,break 结束当前循环。课程批量坏记录登记后继续,成功数、失败数及总额要与逐条结果相符;停止策略需单独说明未处理范围。 |
| 筛选:只把满足条件的记录加入结果;查询:找到就停,找不到也要可观察 | 筛选只收集匹配记录,不修改订单状态;按 ID 查询找到后退出,整轮未找到才报告不存在,不能第一条不匹配就下结论。 |
出了问题:怎么发现、怎么修、怎么验证
只在你自己那份课程副本或专用实验数据上复验,把改之前和改之后的真实结果都留下来。
| 风险/现象 | 提前预防 | 怎样发现 | 怎样处理 | 怎样复验 |
|---|---|---|---|---|
| 条件误写或真值冒充合法性 | 将每侧条件翻译成完整业务判断 | 检查 -1、0、1、True 与未知动作 | 补显式范围/类型与完整比较 | 各路径结果符合合同,失败状态不变 |
| 宽泛捕获吞错或先改后验 | 转换与业务分支分开,更新放成功末端 | 坏输入与非法状态分别运行,比较状态前后 | 缩小 except 范围,移回校验后更新 | 输入错误被说明,程序缺陷仍可定位 |
| 别名串线或 append 后列表变 None | 每条记录独立创建,不接收 append 返回值 | 修改一条后检查另一条及容器类型 | 消除非预期共享,恢复正确修改方式 | 连续处理多条仍互不污染 |
| 循环漏记、重置累计或过早报不存在 | 初始化放循环外,记录每轮 ID | 运行成功—失败—成功、空列表和末项命中 | 修正缩进、continue/break 与未命中出口 | 核对成功数、失败数、总额和未处理项 |
闭卷自测
先自己答一遍,再去运行或翻回课堂核对;不确定的地方标出来,别用 AI 的答案顶掉你自己的第一次判断。
- 依次判断 action 为 pay、cancel、refund 时,错误表达式 action == “pay” or “cancel” 会怎样;说明原因。
- 输入 “二”、“0”、“-1”、“1” 与已解析的 True,应分别在哪个边界处理?
- 执行 alias = orders 后改 alias[0],为什么 orders 会变化?为什么 orders = orders.append(x) 会出错?
- 用成功—失败—成功三条记录手画累计表,分别预测 continue 和 break 的输出与未处理范围。
- 目标在列表最后一项或根本不存在时,查询应何时给出结论?筛选函数能否顺手改订单状态?
再看一眼真实业务
将有赞批次手册中实际展示的结果字段与自己的批量输出比较:失败能否定位到记录、能否知道还有哪些未处理?官方文档没写的规则,就让它空着,别自己补。
今天留下什么,下节课怎么接着用
保留批量校验脚本、规则表、逐条结果与状态前后记录,以及中间坏记录的独立变化。W01-D03 用同一组输入冻结行为,再提取函数与模块。
集合用于去重与成员判断;深拷贝在D04首讲。复杂推导式暂不要求,核心仍能逐轮解释。
本次商城补强怎样复验
| 新增机制 | 商城用途 | 防错与复验 |
|---|---|---|
| raise/else/finally | 记录拒绝与已处理数 | 金额放else、计数放finally,正常/错误都核对 |
| tuple/set/切片 | 固定状态、去重、最近记录 | 去重不承诺原顺序,重复编号和末两条对照 |
| while | 重试输入与退出 | 每轮能改变条件,q必须退出 |
逐项留下原输入、错误现象、最小修复和再次运行结果。若未运行,不写“问题已解决”。