Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析数学表达式_Python_Parsing_Operators_Python 3.4 - Fatal编程技术网

Python 解析数学表达式

Python 解析数学表达式,python,parsing,operators,python-3.4,Python,Parsing,Operators,Python 3.4,下面的代码使用函数“eqn”将一个字符串“d”转换成一个整数和运算符的列表,其中“add”、“subtract”、“multiply”和“divide”分别表示+、-、*和/或。还有一个“否定”操作符,它接受任何正整数并将其转换为负整数。输入和输出示例: 等式(“10 5添加”)应产生[10、5和“添加”] eqn(“5 6添加2否定除法”)应产生[5,6,“添加”、-2,“除法”] 但是,对于否定函数,如果它没有正确使用(不是在数字之后),那么函数应该返回第一个不正确的“否定”的索引号 例

下面的代码使用函数“eqn”将一个字符串“d”转换成一个整数和运算符的列表,其中“add”、“subtract”、“multiply”和“divide”分别表示+、-、*和/或。还有一个“否定”操作符,它接受任何正整数并将其转换为负整数。输入和输出示例:

  • 等式(“10 5添加”)应产生[10、5和“添加”]
  • eqn(“5 6添加2否定除法”)应产生[5,6,“添加”、-2,“除法”]
但是,对于否定函数,如果它没有正确使用(不是在数字之后),那么函数应该返回第一个不正确的“否定”的索引号

例如:

  • 等式(“否定2加2”)应产生0的输出
  • 等式(“2 4添加否定”)应产生3的输出

    def eqn(d):
     extrac = []
    
    for e in eqnStr.split():
     if len(e) == 0:
        continue
    
     try:
        extrac.append(int(e))
        continue
     except ValueError:
        pass
    
     try:
        extrac.append(float(e))
        continue
     except ValueError:
        pass
    
    extrac.append(e)
    
    return extrac
    
问题是否定函数不起作用。不是将整数更改为负数,而是在输出中显示为“否定”,而实际上它应该“消失”。例如:


eqn(“5 6添加2否定除法”)应该产生[5,6,“添加”,-2,“除法”]的输出,但相反,产生[5,6,“添加”,2,“否定”,“除法”]如何解决这个问题,如何让它显示第一个无效否定的索引号?

您需要添加一个特殊情况来处理否定。试着这样做:

def eqn(d):
    extrac = []

    for e in d.split():
        if len(e) == 0:
            continue

        try:
            extrac.append(int(e))
            continue
        except ValueError:
            pass

        try:
            extrac.append(float(e))
            continue
        except ValueError:
            pass

        if e == 'negate':
            if isinstance(extrac[-1], str):
                return len(extrac)
            else:
                extrac[-1] *= -1
                continue

        extrac.append(e)

    return extrac
输出:

   eqn("2 4 add negate")
=> 3
   eqn("5 6 add 2 negate divide")
=> [5, 6, 'add', -2, 'divide']

这是一种错误的RPN方法,它应该包括在解析列表时将操作数推到堆栈上或从堆栈中弹出

例如,
eqn([1,2,3,'+','*')
将执行
(3+2)*1
。内置python“list”类型支持追加(推送)和弹出


这里有更多关于RPN的信息:

2 4 add negate->变成3?@ergonaut是的,因为negate在另一个操作符之后,3是negateSeems的索引。对我来说,
negate
中存在一些差异。你需要一步一步地解释这个问题。这显然不是RPN的工作方式。