使用Python进行公式分析

我怎么能(很容易)取得一个string,例如用户在运行时input的"sin(x)*x^2" ,并产生一个Python函数,可以计算任何x值?

如果你使用Python符号,Python自己的内部编译器可以parsing这个。

如果你稍微改变记号,你会更快乐。

 import compiler eq= "sin(x)*x**2" ast= compiler.parse( eq ) 

你得到一个你可以使用的抽象语法树。

你可以使用Python parser

 import parser formula = "sin(x)*x**2" code = parser.expr(formula).compile() from math import sin x = 10 print eval(code) 

它比纯eval更好,当然,避免代码注入!

  f = parser.parse('sin(x)*x^2').to_pyfunc() 

在哪里可以使用PLY定义parser ,pyparsing,内置标记器,parsing器,ast。

不要在用户input中使用eval

pyparsing可能会做你想做的( http://pyparsing.wikispaces.com/ ),特别是如果string来自不受信任的来源。

另请参阅http://pyparsing.wikispaces.com/file/view/fourFn.py,以获得一个相当全面的计算器。;

为了强调JF Sebastian的build议,“eval”甚至“编译器”解决scheme都可以打开微妙的安全漏洞。 如何可信的是input? 用'编译器',你至less可以从AST中筛选出像getattr查询这样的东西,但是我发现使用PLY或者pyparsing来处理这种事情要比保证让Python帮忙的结果更容易。

另外,“编译器”笨拙而难以使用。 它在3.0中被弃用和删除。 你应该使用'ast'模块(在2.6中添加,2.5中可用'_ast')。

圣人的目的是作为matlabreplace和介绍video,它是演示如何处理您的案件类似。 他们似乎支持各种各样的方法。 由于代码是开源的,您可以浏览并亲自查看作者如何处理这些情况。

与vartec一致。 我会使用SymPy – 特别是lambdify函数应该做你想要的。

请参阅: http : //showmedo.com/videotutorials/video?name=7200080&fromSeriesID=720

这是一个非常好的解释。

最好的祝愿,