CodeBat Python Logic1 caught_speeding函数逻辑错误排查
问题说明
- 返回值规则:
0代表无罚单,1代表小额罚单,2代表大额罚单 - 非生日场景判定标准:
- 车速≤60,返回0
- 车速处于61-80区间(包含两端值),返回1
- 车速≥81,返回2
- 生日场景特殊规则:所有车速判定阈值上调5
- 测试异常现象:调用
caught_speeding(65, True)返回1,预期结果应为0;调用caught_speeding(85, True)返回2,预期结果应为1,其余测试用例运行正常,逐行追踪逻辑未定位到错误点。
原实现代码
def caught_speeding(speed, is_birthday): if speed > 80 or (speed > 85 and is_birthday): return 2 return int((60 < speed <= 80) or (65 < speed <= 85 and is_birthday))
逻辑错误定位
原代码的条件判断存在两处逻辑漏洞:
- 大额罚单分支优先级错误:判断条件中
speed > 80的判定没有区分是否为生日场景,只要车速超过80就直接返回2,完全覆盖了生日场景下81-85速段应判定为小额罚单的规则,直接导致入参为(85, True)时错误返回2。 - 小额罚单分支条件未做场景隔离:
60 < speed <= 80的判定对所有场景生效,生日场景下61-65速段本应属于无罚单区间,但会命中该非生日场景的小额判定规则,直接导致入参为(65, True)时错误返回1。
修正后代码
最易维护的写法是先根据是否为生日计算阈值偏移量,再按档位判定,避免条件交叉写错:
def caught_speeding(speed, is_birthday): offset = 5 if is_birthday else 0 if speed <= 60 + offset: return 0 elif speed <= 80 + offset: return 1 else: return 2
验证异常用例:
- 入参(65, True):偏移量为5,65≤60+5,返回0,符合预期
- 入参(85, True):偏移量为5,65<85≤80+5,返回1,符合预期
- 非生日场景偏移量为0,原有正常用例判定逻辑完全不受影响。
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

