实现python程序的最佳方法是采用字符串并根据运算符优先级输出结果(例如:“4 + 3 * 5”将输出19)。我已经用Google搜索了解决这个问题的方法,但它们太复杂了,我正在寻找一个(相对)简单的问题。
澄清:我需要比eval()略高一些的东西 - 我希望能够添加其他运算符(例如最大运算符 - 4 $ 2 = 4)或者,我对此在学术上比对专业更感兴趣 - 我想知道如何这样做。
答案 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/
它允许您评估不会损害您的计算机或程序的有限声明。