使用“eval”进行用户提供的集成功能?

时间:2012-04-01 16:52:28

标签: python

我试图理解eval(),但没有太多运气。

我正在编写自己的数学库,并试图将集成包含在库中。我需要帮助让python将函数识别为一系列变量,常量和运算符。有人告诉我,eval可以解决问题,但我该如何解决呢?

fofx = input ("Write your function of x here >")
def integrate (fofx):
    #integration algorithm here
    #input fofx and recognize it as f(x) to be integrated.

我已经尝试了文档,但这是有限的,我不知道如何将它应用于我的功能进行评估。

2 个答案:

答案 0 :(得分:4)

我认为eval()的文档非常清晰,并提供了您需要的合理示例。

基本上你想要保存一个要在字符串中计算的表达式:

>>> f = 'x**2 + 2*x'

然后您可以为x定义一个值:

>>> x = 3

最后致电评估:

>>> eval(f)
15

或者,如果您想要对eval进行更多控制,而不是创建名为x的局部变量,那么您可以将参数中的评估环境传递给eval()

>>> f = 'x**2 + 2*x'
>>> eval(f, {}, {'x': 5})
35

您希望控制评估环境的原因是为了避免程序中定义的任何变量无意中被用于评估。

答案 1 :(得分:1)

也许您可能正在考虑抽象语法树模块的'eval'模式,它允许您为单个表达式构建语法树。

例如,下面的代码将采用字符串中的表达式并对其进行修改,使得“x ** 2 + 3 * x ** 4 + 2”更改为“x ** 3 + 3 * x ** 5+ 2' 。 (注意,这不是表达式的组成部分,代码会更长!)

import ast

class IncreasePower(ast.NodeTransformer):
    def visit_BinOp(self,node):
        node=self.generic_visit(node)
        if isinstance( node.op , ast.Pow) and isinstance(node.right, ast.Num):
            node.right.n+=1
        return node

x=4
s='x**2+3*x**4+2'
print eval(s)

A = ast.parse(s,'source','eval')
B = IncreasePower().visit(A)
E = compile(A,'increased','eval')

print eval(E)

您可能还会发现查看使用不同方法构建表达式的符号数学库sympy很有帮助。在构建表达式之前,先从x = sympy.Symbol(“x”)开始。

“sympy.integrate”功能进行符号整合。