You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:36:04