1

我正在尝试制作可以使用基本 4 个运算符解决表达式的计算器,例如 1+2*3-4/5,但是它不起作用,我不知道出了什么问题。请检查我的代码。当我运行它时,我在 8 行中收到了无数个错误。return ret(parts[0]) * ret(parts[2]) 这是代码

def ret(s):
    s = str(s)
    if s.isdigit():
        return float(s)
    for c in ('*','/','+','-'):
        parts = s.partition(c)
        if c == '*':
            return ret(parts[0]) * ret(parts[2])
        elif c == '/':
            return ret(parts[0]) / ret(parts[2])
        elif c == '+':
            return ret(parts[0]) + ret(parts[2])
        elif c == '-':
            return ret(parts[0]) - ret(parts[2])
print(ret('1+2'))

错误回溯以:

  File "C:\Python33\calc.py", line 8, in ret
    return ret(parts[0]) * ret(parts[2])
  File "C:\Python33\calc.py", line 2, in ret
    s = str(s)
RuntimeError: maximum recursion depth exceeded while calling a Python object
4

9 回答 9

1

您做错的主要事情是您正在检查c而不是分区运算符的值。您还可以s.partition通过使用 left 和 right 进行实际操作来解压结果以使事情变得更容易。

def ret(s):
    s = str(s)
    if s.isdigit():
        return float(s)
    for c in ('-','+','*','/'):
        left, op, right = s.partition(c)
        if op == '*':
            return ret(left) * ret(right)
        elif op == '/':
            return ret(left) / ret(right)
        elif op == '+':
            return ret(left) + ret(right)
        elif op == '-':
            return ret(left) - ret(right)
print(ret('1+2'))

此外,您需要颠倒运算顺序,因为您首先要进行加法和减法,然后是乘法和除法。

我的意思是,如果你有这样的表达4+4*3,你想把它分成

ret(4) + ret(4 * 3)

由于它是递归调用,因此您希望具有最高优先级的运算符位于调用堆栈上的最后一个,以便在函数返回时首先执行它们。

举个例子:

print(ret('1+2*6'))
print(ret('3*8+6/2'))

输出

13.0
27.0
于 2013-02-27T10:19:55.447 回答
1

无论如何,您都对输入字符串进行分区,从不检查运算符是否在那里。.partition()如果输入中不存在分区字符,则返回空字符串:

 >>> '1+1'.partition('*')
 ('1+1', '', '')

所以你会打电话s.partition('*')但从不检查是否有任何这样的运营商存在,导致无条件调用ret(). 无论是否在场,您都会打电话。ret(parts[0]) * ret(parts[2])*s

解决方案是先测试运算符或检查.partition(). 后者可能是最简单的:

for c in ('+','-','*','/'):
    parts = s.partition(c)
    if parts[1] == '*':
        return ret(parts[0]) * ret(parts[2])
    elif parts[1] == '/':
        return ret(parts[0]) / ret(parts[2])
    elif parts[1] == '+':
        return ret(parts[0]) + ret(parts[2])
    elif parts[1] == '-':
        return ret(parts[0]) - ret(parts[2])

请注意,我颠倒了操作员的顺序;是的,乘法和除法需要在加法和减法之前应用,但你在这里是相反的;将表达式分成更小的部分,然后在处理子表达式时应用操作。

您可以使用分配解包将 3 个返回值分配.partition()给更简单的名称:

for c in ('+','-','*','/'):
    left, operator, right = s.partition(c)
    if operator == '*':
        return ret(left) * ret(right)
    elif operator == '/':
        return ret(left) / ret(right)
    elif operator == '+':
        return ret(left) + ret(right)
    elif operator == '-':
        return ret(left) - ret(right)

接下来,您可以使用该模块简化所有这些操作,该模块具有执行与算术运算相同的操作的功能。地图应该这样做:operator

import operator
ops = {'*': operator.mul, '/': operator.div, '+': operator.add, '-': operator.sub}

for c in ('+','-','*','/'):
    left, operator, right = s.partition(c)
    if operator in ops:
        return ops[operator](ret(left), ret(right))
于 2013-02-27T10:23:41.493 回答
0

您的调度不正确。您定义函数的方式将始终尝试按“*”拆分,这基本上使用相同的参数递归调用 ret 函数...

您必须首先检查参数字符串中是否存在“运算符”。

再想想!

于 2013-02-27T10:22:05.633 回答
0

在您的代码中,您对 的结果没有条件s.partition(c),因此即使分区导致('anything', '', '')您将在第一个 if 上进行递归。

已编辑

于 2013-02-27T10:28:15.697 回答
0

这是一个简单的python计算器程序,请随意使用:

#Python calculator

def menu():
    print ("Welcome to calculator.py")
    print ("your options are:")
    print (" ")
    print ("1) Addition")
    print ("2) Subtraction")
    print ("3) Multiplication")
    print ("4) Division")
    print ("5) Quit calculator.py")
    print (" ")
    return input ("Choose your option: ")

def add(a,b):
    print (a, "+", b, "=", a + b)

def sub(a,b):
    print (b, "-", a, "=", b - a)

def mul(a,b):
    print (a, "*", b, "=", a * b)

def div(a,b):
    print (a, "/", b, "=", a / b)

loop = 1
choice = 0
while loop == 1:
    choice = menu()
    if choice == 1:
        add(input("Add this: "),input("to this: "))
    elif choice == 2:
        sub(input("Subtract this: "),input("from this: "))
    elif choice == 3:
        mul(input("Multiply this: "),input("by this: "))
    elif choice == 4:
        div(input("Divide this: "),input("by this: "))
    elif choice == 5:
        loop = 0

print ("Thank you for using calculator.py!")
于 2013-10-13T16:39:30.483 回答
0

如何条件用户输入数字 1 和数字 2,如果它在字符串中。使用 if/else 或 try/except。

print("\n Select A Number \n")
print("Press 1 for Addition")
print("Press 2 for Subtraction")
print("Press 3 for multiplication")
print("Press 4 for Division \n")

while True:
    user = input("Enter A Choice(1/2/3/4): ")
    if user in ('1','2','3','4'):
        num1 = int(input("Enter First Number: "))
        num2 = int(input("Enter Second Number: "))

        if user == '1':
            print(f"{num1} + {num2} = {num1 + num2}")
            print("Thanks For Usnig This Calculator")
        elif user == '2':
            print(f"{num1} - {num2} = {num1 - num2}")
            print("Thanks For Usnig This Calculator")
        elif user == '3':
            print(f"{num1} * {num2} = {num1 * num2}")
            print("Thanks For Usnig This Calculator")
        elif user == '4':
            print(f"{num1} / {num2} = {num1 / num2}")
            print("Thanks For Usnig This Calculator")
        else:
            print("Please Enter Correct Choice")
    else:
        print("Invalid")
于 2021-09-06T12:53:51.253 回答
0
#1. Create a class with the name Calculator
class Calculator:
    #2. Declare two class variables num1 and num2
    num1=""
    num2=""
    result=""
    option=""
    #3. Initialize the class variables num1 and num2 in constructor __init__()
    def __init__(self):
        self.num1=0
        self.num2=0
        self.result=0
        self.option=0
    #4. Make getter and setter function for variables
    def getNum1(self):
        return self.num1
    def setNum1(self,n1):
        self.num1=n1 
    def getNum2(self):
        return self.num2
    def setNum2(self,n2):
        self.num2=n2
    def getResult(self):
        return self.result
    def setResult(self,r):
        self.result=int(r)
    def getOption(self):
        return self.option
    def setOption(self,op):
        self.option=op
    
    #5. Create Main Manu function to display choices
    def mainMenu(self):
        print("==============")
        print("==CALCULATOR==")
        print("==============")
        print("Menu:")    
        print("1. Addtion")
        print("2. Subtraction")
        print("3. Multiplication")
        print("4. Division")
        print("5. Remainer")
        print("6. Exit")
        print("")
        self.setOption(int(input("Enter Option:")))
        self.setNum1(int(input("Enter Number1:")))
        self.setNum2(int(input("Enter Number2:")))
        
    #6. Make a function Take Input
    def takeInput(self):
        if self.option==1:
            self.setResult(self.getNum1()+self.getNum2())
        elif self.option==2:
            self.setResult(self.getNum1()-self.getNum2())
        elif self.option==3:
            self.setResult(self.getNum1()*self.getNum2())
        elif self.option==4:
            self.setResult(self.getNum1()/self.getNum2())
        elif self.option==5:
            self.setResult(self.getNum1()%self.getNum2())
            
    #7. Make a display function to display the output
    def display(self):
        resultOption=""
        print("")
        if self.option==1:
            resultOption="Addition"
        elif self.option==2:
            resultOption="Subtraction"
        elif self.option==3:
            resultOption="Multiplication"
        elif self.option==4:
            resultOption="Division"
        elif self.option==5:
            resultOption="Remainder"
        if self.option==1 or self.option==2 or self.option==3 or self.option==4 or self.option==5:
            print(resultOption+":"+str(self.getResult()))
        else:
            print("Invalid Input")
        self.option=input("press x to exit, 0 to continue...")
        if self.option=="x":
            pass
        else:
            self.option=int(self.option)
            

#8. Create Object of Calculator Class  
c1=Calculator()
op=0

#9. Get option in while loop until x is pressed
while(c1.getOption()!='x'):
    #10.    Call display menu, input and display functions to display the output
    c1.mainMenu()
    c1.takeInput()
    c1.display()
于 2022-02-05T11:51:22.260 回答
-1

我有一个替代你的代码。用户可以输入如下内容:8*6/4-3+3,这仍然有效。非常紧凑,如果您希望命令退出:

while True:

只需添加:

if(y == "end" or y == "End"):
    break

它会退出“while True:”

代码(Python v3.3.0):

while True:
    x = "x="
    y = input(" >> ")
    x += y
    exec(x)
    print(x)
于 2014-02-27T23:58:39.043 回答
-1

这是 python 中的简单代码,用于创建与 Python 终端相同的计算器。

number = input("")
print number
于 2017-09-15T11:59:05.747 回答