数学表达式评估

时间:2009-10-09 18:35:42

标签: python parsing math expression evaluation

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

澄清:我需要比eval()略高一些的东西 - 我希望能够添加其他运算符(例如最大运算符 - 4 $ 2 = 4)或者,我对此在学术上比对专业更感兴趣 - 我想知道如何这样做。

6 个答案:

答案 0 :(得分:16)

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

Simple Top-Down Parsing in Python是一篇很好的文章,它构建了一个示例解析器来完成您想要做的事情:评估数学表达式。

我强烈建议您去编写自己的第一个解析器 - 这是“啊,如何工作”的时刻之一!

答案 1 :(得分:2)

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

result = eval(expression)

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

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

但这只是在您需要安全性的情况下,即如果您允许任何人输入任何表达式。

当然,既然你这样就阻止了所有locla变量的使用,那么就没有任何变量可供使用,所以你需要传入那些应该在字典中访问的变量。

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

或类似。

答案 2 :(得分:2)

另一种可能性是查看Pyparsing,它是一般的解析器构建器。它比您需要的功能更强大,但实现起来可能更快。

答案 3 :(得分:1)

我对Python和任何极端的Pythonic方法都不是很熟悉,但是你可以看看{4}},这是在Gang of Four书中定义的。它专为处理“语言”而设计,数学表达式遵循特定语言的规则。实际上,维基百科上的示例实际上是RPN计算器的Java实现。

答案 4 :(得分:0)

答案 5 :(得分:0)

此附件为您的问题提供了正确的答案:

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

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