Python中如何减少变量名不同但逻辑一致的重复代码
优化方案
核心思路是对相同逻辑的分类做抽象,通过统一配置、统一存储、通用方法的方式完全消除重复代码,后续新增分类仅需修改一行配置,无需新增属性或方法。
核心优化点
- 提前定义分类配置列表,避免硬编码分类名称
- 用嵌套字典统一存储所有分类的占比、已消费金额、剩余额度属性,无需为每个分类单独声明多个变量
- 将三个分类重复的计算逻辑合并为通用方法,接收分类名和消费金额即可完成计算和输出
- 简化存款方法的判断逻辑,无需写大量
if-elif分支,直接校验输入分类是否在配置列表中即可
优化后完整代码
# 所有分类统一在此配置,新增分类仅需加名称即可 CATEGORIES = ("wants", "needs", "food") class Budget: def __init__(self): # 批量初始化所有分类的属性 self.categories = { cate: {"perc": 0, "amt": 0, "left": 0} for cate in CATEGORIES } # 获取税后月收入 while True: try: self.monthly_income = float(input("Enter your monthly income after taxes: ")) break except ValueError: print("Invalid Input : Please enter a number") continue # 获取各分类预算占比 while True: print("Enter desired percentage of income spent for each category (do not include %): ") total_perc = 0 try: for cate in CATEGORIES: self.categories[cate]["perc"] = float(input(f"{cate.capitalize()}: ")) total_perc += self.categories[cate]["perc"] # 校验占比总和在95%-105%区间 if not 95 <= total_perc <= 105: print("Invalid Input : Must add to 100%") continue break except ValueError: print("Invalid Input : Please enter a number") continue def add_expense(self, cate, amount): # 所有分类通用的消费计算逻辑 cate_data = self.categories[cate] max_amt = (cate_data["perc"] / 100) * self.monthly_income cate_data["amt"] += amount cate_data["left"] = max_amt - cate_data["amt"] print(f"Amount spent on {cate}: ${cate_data['amt']} \nAmount left to spend: ${round(cate_data['left'],2)}") def deposit(self): dep_loc = input("Where would you like to deposit? ").lower() if dep_loc not in CATEGORIES: print("Invalid Input") return # 获取存款金额 while True: try: dep_amt = float(input("Deposit amount: ")) self.add_expense(dep_loc, dep_amt) break except ValueError: print("Invalid Input : Please enter a number") continue if __name__ == "__main__": wyatt = Budget() while True: wyatt.deposit()
如果需要单独访问某个分类的属性,直接使用self.categories["wants"]["amt"]即可,和你原有代码的self.wants_amt效果完全一致。
内容的提问来源于stack exchange,提问作者whm33
相关产品推荐
相关产品推荐

