数学表达式求值

9 投票
5 回答
14263 浏览
提问于 2025-04-15 14:57

我想知道怎么写一个Python程序,能够处理一个字符串,并根据运算符的优先级输出结果(比如说:“4+3*5”会输出19)。我在网上查过解决这个问题的方法,但都太复杂了,我希望能找到一个相对简单的办法。

补充说明:我需要的东西比eval()稍微复杂一点——我想能添加其他运算符(比如说一个最大值运算符——4$2 = 4),另外,我对这个问题的兴趣更多是学术上的,而不是职业上的——我想知道怎么做到这一点。

5 个回答

1

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

result = eval(expression)

不过要小心,它能做的事情可多了,主要是可以调用函数,所以为了安全起见,你应该确保它不能访问本地变量或全局变量。此外,它还可以访问一些内置的方法,包括比较复杂的import,所以你也需要阻止对这个的访问:

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

但这只是当你需要安全性的时候,也就是说,如果你允许任何人输入任何表达式。

当然,由于这样会阻止所有本地变量的使用,所以你就没有变量可以用了。因此,如果你想使用变量,你需要把那些应该被访问的变量放进字典里。

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

或者类似的方式。

2

另一个选择是看看 Pyparsing,这是一个通用的解析器构建工具。虽然它的功能比你需要的要强大,但可能会更快实现。

16

如果你对这个话题“学术上感兴趣”,那么你想了解如何编写一个带有运算符优先级的解析器。

用Python进行简单的自顶向下解析是一篇很不错的文章,它展示了一个示例解析器,正好可以帮助你实现你想做的事情:计算数学表达式。

我非常推荐你尝试自己写一个解析器——这会让你有一种“哦,原来是这样运作的”的感觉!

撰写回答