代码之家  ›  专栏  ›  技术社区  ›  Ori Shavit

数学表达式求值

  •  9
  • Ori Shavit  · 技术社区  · 17 年前

    实现一个接受字符串并根据运算符优先级输出结果的python程序的最佳方法是什么(例如:“4+3*5”将输出19)。我在谷歌上搜索了解决这个问题的方法,但它们都太复杂了,我正在寻找一个(相对)简单的方法。

    如何 为了做到这一点。

    5 回复  |  直到 8 年前
        1
  •  16
  •   Martin B    17 年前

    如果你“对学术感兴趣”,你想学习如何编写具有运算符优先级的解析器。

    Simple Top-Down Parsing in Python

    我强烈建议你尝试编写自己的第一个解析器——它就是那种“啊, 那是 这是如何运作的“时刻!

        2
  •  2
  •   Lennart Regebro    17 年前

    另一种可能性是看 Pyparsing ,它是一个通用的解析器构建器。它比你需要的更强大,但实施起来可能更快。

        3
  •  2
  •   Kathy Van Stone    17 年前

    我对Python和任何非常Python化的方法都不太熟悉,但你可以看看 Interpreter pattern ,这在四人帮的书中有定义。它是为处理“语言”而设计的,数学表达式确实遵循特定的语言规则。事实上,维基百科上的例子实际上是RPN计算器的Java实现。

        4
  •  1
  •   Thomas Owens    17 年前

    这就是Python中“eval”函数的作用。

    result = eval(expression)
    

    尽管它可以做更多的事情,主要是调用函数,但要小心,为了安全起见,你应该确保它不能访问本地或全局。此外,您还可以访问内置方法,包括棘手的 导入 因此,您也需要阻止对该内容的访问:

    result = eval(expression, {'__builtins__': None}, {})
    

    当然,由于你以这种方式阻止了所有locla变量的使用,那么你就没有任何变量可以使用,所以要使用它,你只需要传入那些应该在字典中访问的变量。

    vars = {'__builtins__': None, 'x': x}
    result = eval(expression, vars, {})
    

    或类似。

        5
  •  0
  •   Kaouni    15 年前

    此接收器为您的问题提供了正确的答案:

    http://code.activestate.com/recipes/496746-restricted-safe-eval/

    它允许您评估不会损害您的计算机或程序的有限语句。

        6
  •  0
  •   Philippe F    15 年前