用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

因此,我目前正在开发一个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
            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循环不一定要在那里,但它只会使脚本在列表中重复两次。