Python单函数多条件写法优化:chocolate_maker代码评审咨询
巧克力块拼接判断函数代码评审
现有代码问题
- 核心逻辑错误:当前判断规则完全遗漏了「不需要用完所有库存巧克力,只用部分块就能凑出目标长度」的合法场景。按照题设逻辑,小巧克力每块长1单位、大巧克力每块长5单位,只要选出的块数不超过库存、总长度等于x就应该返回True,但现有代码只覆盖了三种极特殊情况:
- 把所有小巧克力、所有大巧克力全用上,总长度刚好等于x
- 刚好用完所有小巧克力凑出x
- 刚好用完所有大巧克力凑出x
举个明确的反例:入参small=3, big=2, x=11时,选2块大巧克力(共10单位)+1块小巧克力(1单位)就能凑出11单位长度,按需求应返回True,但现有代码会返回False——因为总库存长度是3+10=13不等于11,全用小的凑不够,全用大的只有10单位也不够,直接出现误判。
- 冗余代码多:
small * 1属于无意义运算,直接使用small变量即可;判断完布尔结果后写if/else分支分别返回True/False完全多余,可以直接返回判断表达式的结果。 - 文档字符串不规范:参数说明重复啰嗦,返回值描述和错误的逻辑绑定,没有说明函数核心作用,也没讲清参数、返回值的实际含义。
优化实现方案
这个问题不需要写复杂循环或者多分支判断,用O(1)复杂度的算术运算就能覆盖所有场景,逻辑拆成两步即可:
- 先算最多能用上多少块大巧克力:既不能超过手头的大巧克力库存,也不能超过目标长度能容纳的大巧克力数量(即x除以5取整)
- 用完最大可用数量的大巧克力后,剩下的长度缺口如果小于等于手头的小巧克力库存,就说明能凑出目标长度,否则不行
优化后的代码如下:
def chocolate_maker(small: int, big: int, x: int) -> bool: """判断现有巧克力块能否恰好拼接出目标长度 :param small: 1单位长度的小巧克力库存数量 :param big: 5单位长度的大巧克力库存数量 :param x: 需要拼接的目标总长度 :return: 可恰好拼接返回True,否则返回False """ valid_big_count = min(big, x // 5) remain_length = x - valid_big_count * 5 return remain_length <= small
优化收益
- 逻辑无遗漏:覆盖所有合法拼接场景,不会出现之前的误判问题
- 执行效率更高:全程只有基础算术和比较运算,无多余分支,计算量极小
- 可读性更强:代码步骤清晰,去掉了无意义的冗余写法,补充了类型提示,文档说明准确
内容的提问来源于stack exchange,提问作者Ofir Biton
相关产品推荐
相关产品推荐

