使用Python,我将如何读取(来自字符串,文件或url)数学表达式(1 + 1是一个好的开始)并执行它?
除了抓取字符串,文件或网址之外,我不知道从哪里开始。
答案 0 :(得分:7)
因为python支持一些代数形式,你可以这样做:
eval("1 + 1")
但这允许输入执行env中定义的任何内容:
eval("__import__('sys').exit(1)")
另外,如果你想支持python不支持的东西,那么这种方法就失败了:
x³ + y² + c
----------- = 0
z
您可以使用ply实现标记生成器和解析器,而不是这样做。评估像'1 + 1'这样的东西不应该超过十行左右。
您也可以手动实现tokenizer和解析器。阅读有关LL和LR解析器的信息。在尝试之前,最好先学习使用解析器生成器。
答案 1 :(得分:2)
如果您将表达式作为字符串接收,则需要将其解析为其运算符和操作数,然后处理生成的树。这本身并不是一个python问题。但是如何处理作为字符串传递的数学表达式的一般问题。
快速谷歌揭示了一堆python的词法分析器。
答案 2 :(得分:2)
除非您想学习如何编写解析器,否则不要编写自己的解析器。正如@ J.F的评论中已经提到的那样。塞巴斯蒂安,我建议像computer algebra system (CAS)一样全面SAGE。它将处理多比1 + 1更复杂的数学陈述:)
答案 3 :(得分:1)
也许eval
就是你所追求的?
>>> eval('1+1')
2
答案 4 :(得分:1)
了解input功能。
答案 5 :(得分:0)
您可以利用Python自己的评估功能。然而,盲目使用eval()是非常危险的,因为有人可以欺骗你的程序:
eval( (__import__("os").system("rm important_file") or 1) + 1)
使用eval的正确方法是使用以下receipe,这将确保您正在评估的表达式中不包含任何危险:
http://code.activestate.com/recipes/496746-restricted-safe-eval/