我正在尝试使用基本的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'))
答案 0 :(得分:1)
你做错的主要是你正在检查c
的值而不是分区运算符。您还可以从s.partition
解压缩结果,通过左右使用实际操作来简化操作。
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
答案 1 :(得分: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])
请注意,我颠倒了运营商的订单;是的,需要在加法和减法之前应用乘法和除法,但是你在 reverse 这里工作;将表达式拆分为更小的部分,然后在处理子表达式时应用操作。
您可以使用赋值解压缩将.partition()
的3个返回值分配给更简单的名称:
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
module 简化所有这一切,{{3}}具有与算术运算执行相同操作的函数。地图应该:
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))
答案 2 :(得分:0)
您的调度不正确。你定义你的函数的方式是总是尝试用'*'分割,它基本上用相同的参数递归地调用ret函数...
您必须首先检查参数字符串中是否存在“运算符”。
再想一想!
答案 3 :(得分:0)
在您的代码中,您对s.partition(c)
的结果没有任何条件,因此即使分区产生('anything', '', '')
,您也会对第一个if进行递归。
<强>被修改强>
答案 4 :(得分: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!")
答案 5 :(得分:-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)
答案 6 :(得分:-1)
这是python中用于创建与Python终端相同的计算器的简单代码。
number = input("")
print number