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

Python计算器程序问题:输入数值后运算仍使用初始默认值1和1

Python计算器运算值始终为初始默认值的修复方案

问题根源

你的calculator()方法中,operationDict在方法启动时就完成初始化,字典里的self.multiplication()、self.division()等方法会立即执行,此时self.number1和self.number2还是类初始化时的默认值1。后续即使输入新的数值,字典里存储的依然是最初计算的结果,不会随输入更新。

修复方案

方案一:存储方法引用,按需调用

将字典中的方法调用改为方法本身(不带括号),等用户选择操作后再执行方法,确保使用最新的输入数值计算:

class Calculator:
  
    def __init__(self, number1=1, number2=1):
        self.number1 =  number1
        self.number2 =  number2

    def calculator(self):
        # 存储方法引用,不立即执行
        operationDict = { "*": self.multiplication, "/": self.division, "+": self.sumOf, "-": self.subtraction}
        while True:
            self.number1 = int(input("Enter a digit, 0 to 9: "))
            self.number2 = int(input("Enter another digit, 0 to 9: "))
            print("number1 is: ", self.number1, " the number2 is: ", self.number2)
            operation = input("Enter a +,-,/,*: ")
            # 校验操作符合法性并调用方法
            if operation in operationDict:
                print(operationDict[operation]())
        
    def sumOf(self):
        osum = self.number1 + self.number2
        self.osum = osum
        return osum

    def subtraction(self):
        osubs = self.number1 - self.number2
        self.osubs = osubs       
        return osubs
  
    def division(self):
        # 新增除数不为0的判断
        if self.number2 == 0:
            return "Error: Cannot divide by zero"
        odiv = self.number1 / self.number2
        self.odiv = odiv
        return round(odiv,2)
 
    def multiplication(self):
        omult = self.number1 * self.number2
        self.omult = omult
        return omult

oCalculator = Calculator()
oCalculator.calculator()

方案二:每次输入后重新生成运算字典

如果需要直接存储运算结果,可以在获取用户输入的数值后,再初始化operationDict,确保字典中的结果基于最新数值计算:

class Calculator:
  
    def __init__(self, number1=1, number2=1):
        self.number1 =  number1
        self.number2 =  number2

    def calculator(self):
        while True:
            self.number1 = int(input("Enter a digit, 0 to 9: "))
            self.number2 = int(input("Enter another digit, 0 to 9: "))
            print("number1 is: ", self.number1, " the number2 is: ", self.number2)
            # 每次输入后重新生成字典,使用最新数值计算结果
            operationDict = { "*": self.multiplication(), "/": self.division(), "+": self.sumOf(), "-": self.subtraction()}
            operation = input("Enter a +,-,/,*: ")
            # 用elif替代多个if,提升效率
            if operation == "*":
                print(operationDict["*"])
            elif operation == "-":
               print(operationDict["-"])
            elif operation == "+":
               print(operationDict["+"])
            elif operation == "/":
               print(operationDict["/"])
        
    def sumOf(self):
        osum = self.number1 + self.number2
        self.osum = osum
        return osum

    def subtraction(self):
        osubs = self.number1 - self.number2
        self.osubs = osubs       
        return osubs
  
    def division(self):
        if self.number2 == 0:
            return "Error: Cannot divide by zero"
        odiv = self.number1 / self.number2
        self.odiv = odiv
        return round(odiv,2)
 
    def multiplication(self):
        omult = self.number1 * self.number2
        self.omult = omult
        return omult

oCalculator = Calculator()
oCalculator.calculator()

额外优化提示

  • 给除法添加除数不为0的判断,避免抛出运行时异常
  • 使用elif替代多个独立if,减少不必要的条件判断
  • 可以添加退出逻辑,比如输入q时终止循环

内容的提问来源于stack exchange,提问作者Takahan Nft

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:27:16