如何操作两个列表实现CashRegister类的receipt小票打印方法
购物小票打印功能实现方案
修复后完整代码
class CashRegister: def __init__(self, names=None, prices=None): self._itemCount = 0 self._totalPrice = 0.0 # 初始化参数兼容空值,避免传参报错 self._names = list(names) if names else [] self._prices = list(prices) if prices else [] # 初始化默认税率为0,避免未设置税率时调用报错 self._tax_percent = 0 def addItem(self, name, price): # 追加单个商品到列表,而非覆盖原有列表 self._names.append(name) self._prices.append(price) def getTotal(self): self._totalPrice = sum(self._prices) return self._totalPrice def getCount(self): self._itemCount = len(self._prices) return self._itemCount def clear(self): self._itemCount = 0 self._totalPrice = 0.0 self._names.clear() self._prices.clear() def updatetax(self, tax): if 1 <= tax <= 20: self._tax_percent = tax / 100 # 转为百分比系数,避免后续计算错误 else: self._tax_percent = 0 def get_total_tax(self): return self.getTotal() * self._tax_percent def reciept(self): print("===== 购物小票 =====") # 用zip函数同时遍历商品名、价格两个列表,配对输出 for name, price in zip(self._names, self._prices): print(f"{name}: {price}元") print("====================") print(f"商品总数: {self.getCount()}件") print(f"商品总价: {self.getTotal():.2f}元") print(f"税费: {self.get_total_tax():.2f}元") print(f"应付总额: {(self.getTotal() + self.get_total_tax()):.2f}元")
核心逻辑说明
- 原有代码的
__init__和addItem方法存在覆盖原有商品列表、生成嵌套列表的错误,修复后改为初始化直接接收列表、新增商品用append追加到对应列表 - 两个列表同步遍历使用Python内置
zip()函数实现,会自动按顺序配对两个列表的同位置元素,刚好满足「商品名:价格」的输出需求 - 税率计算默认转为百分比系数,避免出现税费高于商品总价的逻辑错误,输出金额统一保留2位小数符合收银场景习惯
调用示例
# 初始化收银台,传入初始商品列表 cash_reg = CashRegister(["可口可乐", "乐事薯片", "康师傅矿泉水"], [3.5, 8.9, 2.0]) # 新增单个商品 cash_reg.addItem("双汇火腿肠", 3.0) # 设置税率为3% cash_reg.updatetax(3) # 打印购物小票 cash_reg.reciept()
输出效果
===== 购物小票 ===== 可口可乐: 3.5元 乐事薯片: 8.9元 康师傅矿泉水: 2.0元 双汇火腿肠: 3.0元 ==================== 商品总数: 4件 商品总价: 17.40元 税费: 0.52元 应付总额: 17.92元
内容的提问来源于stack exchange,提问作者pleasebekind
相关产品推荐
相关产品推荐

