Python类get_low_price方法无法正确返回最低价商品问题排查
问题背景
为类实现获取最低价格商品的方法时,运行后程序输出了所有商品的价格,未达到预期的输出最低价商品的效果,原始实现代码如下:
def get_low_price(self): self.get_total_toys() #To check if toybox is empty or not if self.total > 0: msg = f'The toy box contains {self.total} toys\n' for a_toy in self.all_toys: self.get_total_cost() msg += f'A {(a_toy.colour).lower()} {a_toy.name} which cost ${a_toy.price:.2f}\n' for i in [a_toy.price]: i = ([i]) print(min(i)) return f'{msg}Total cost: ${self.cost_total:.2f}'
存在的逻辑问题
代码未实现预期效果的核心原因是最低价计算的逻辑设计存在多处缺陷,具体如下:
- 最小值计算作用域错误:
print(min(i))写在了遍历所有玩具的外层for循环内部,每遍历到一个玩具就会执行一次求最小值、打印的操作,而不是等所有商品遍历完成后,基于全量商品价格计算全局最小值。 - 缺失全量商品比对逻辑:内层写了无意义的单元素循环
for i in [a_toy.price],每次执行时只会把当前单个玩具的价格包装成单元素列表,从来没有在遍历过程中记录、比对价格,每次求min时列表里只有当前遍历到的单个商品价格,自然会把每个商品的价格依次打印出来。 - 存在冗余方法调用:
self.get_total_cost()被放在了遍历玩具的循环内部,每遍历一个玩具就会重新计算一次总价,这个方法只需要在所有商品遍历完成后调用一次即可,循环内重复调用会产生不必要的性能开销。 - 未关联最低价对应的商品属性:就算算出了最低价格数值,也没有匹配该价格对应的玩具名称、颜色属性,无法达成“输出最低价格商品”的需求,只能输出孤立的价格数值。
修正后代码参考
def get_low_price(self): self.get_total_toys() # 玩具盒非空时才执行后续逻辑 if self.total > 0: msg = f'The toy box contains {self.total} toys\n' # 初始化最低价、最低价对应商品的变量 min_price = float('inf') cheapest_toy = None for a_toy in self.all_toys: # 拼接单个玩具的描述信息 msg += f'A {(a_toy.colour).lower()} {a_toy.name} which cost ${a_toy.price:.2f}\n' # 遍历过程中实时比对更新最低价和对应商品 if a_toy.price < min_price: min_price = a_toy.price cheapest_toy = a_toy # 所有商品遍历完成后统一计算总价 self.get_total_cost() # 拼接最低价商品信息 msg += f'\nThe lowest price toy is a {(cheapest_toy.colour).lower()} {cheapest_toy.name}, costs ${min_price:.2f}\n' return f'{msg}Total cost: ${self.cost_total:.2f}' # 玩具盒为空时返回对应提示 return "The toy box is empty, no toys to show."
内容的提问来源于stack exchange,提问作者python_newbie
相关产品推荐
相关产品推荐

