用python解析数学表达式
因此,我目前正在开发一个python程序来解析数学表达式字符串并对其求值。我目前拥有以下代码:用python解析数学表达式,python,python-3.x,Python,Python 3.x,因此,我目前正在开发一个python程序来解析数学表达式字符串并对其求值。我目前拥有以下代码: def evaluate(string): expr = [a for a in string if a!=" "] for i,char in enumerate(expr): if char=="/": tmp = int(expr[i-1])/int(expr[i+1]) expr[i+1] = tmp
def evaluate(string):
expr = [a for a in string if a!=" "]
for i,char in enumerate(expr):
if char=="/":
tmp = int(expr[i-1])/int(expr[i+1])
expr[i+1] = tmp
expr.pop(i)
expr.pop(i-1)
elif char=="*":
tmp = int(expr[i-1])*int(expr[i+1])
expr[i+1] = tmp
expr.pop(i)
expr.pop(i-1)
for i,char in enumerate(expr):
if char=="-":
tmp = int(expr[i-1])-int(expr[i+1])
expr[i+1] = tmp
expr.pop(i)
expr.pop(i-1)
elif char=="+":
tmp = int(expr[i-1])+int(expr[i+1])
expr[i+1] = tmp
expr.pop(i)
expr.pop(i-1)
return expr
我给它输入2/2+3*4-6*2
,它返回[“13”、“-”和“12”]
。我为诊断问题而采取的一些步骤是:1.我将返回表达式移动到两个for循环之间。然后程序返回
[“1.0”、“+”、“12”、“-”、“12”]
,因此我知道第二个循环只计算+
2.我认为
-
代码块可能有问题,但当我将输入更改为2/2+3*4+6*2
时,它输出[“13”、“+”和“12”]
3.我让它在第二个循环中打印出I,然后打印出
0,1,2
。这就是问题所在,它只是在列表的前3个元素中进行迭代。我觉得这个问题与修改列表有关,而且不知怎么搞砸了枚举。但是,第一个for循环工作正常而第二个for循环中断的问题是什么?如果有任何帮助,我将不胜感激,因为我非常困惑请使用此改进的代码:
def evaluate(string):
expr = [a for a in string if a!=" "]
while( ('*' in expr) or ('/' in expr) or ('+' in expr) or ('-' in expr) ):
for i,char in enumerate(expr):
if char=="/":
expr[i+1] = int(expr[i-1])/int(expr[i+1])
del expr[i]
del expr[i-1]
elif char=="*":
expr[i+1] = int(expr[i-1])*int(expr[i+1])
del expr[i]
del expr[i-1]
for i,char in enumerate(expr):
if char=="-":
expr[i+1] = int(expr[i-1])-int(expr[i+1])
del expr[i]
del expr[i-1]
elif char=="+":
expr[i+1] = int(expr[i-1])+int(expr[i+1])
del expr[i]
del expr[i-1]
return expr
您需要递归地计算一些表达式。如果不说明如何实际执行解析,
evaluate(“2*3+6”)
应该等同于evaluate(“2*3”)+evaluate(“6”)
。通常,您先解析,然后对结果结构求值。Google“递归下降解析”。这里的pop()方法不正确,最好使用del list[i]@OakenDuck这是一个坏主意,因为无论操作是否执行,我们都会在每次迭代中弹出()元素not@n1tr0xs你说得对,我将删除我的注释。第二个for循环不一定要在那里,但它只会使脚本在列表中重复两次。