Python 使用;“评估”;对于用户提供的集成功能?

Python 使用;“评估”;对于用户提供的集成功能?,python,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 i

我试图理解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.
我已经尝试了文档,但这是有限的,我不知道如何将其应用到我要评估的函数中

的文档在我看来非常清楚,并给出了您需要的合理示例

基本上,您希望在字符串中保存要计算的表达式:

>>> f = 'x**2 + 2*x'
然后可以为
x
定义一个值:

>>> x = 3
最后,请致电评估:

>>> eval(f)
15
或者,与创建名为
x
的局部变量不同,如果您希望对eval的调用进行更严格的控制,则可以将参数中的求值环境传递到
eval()

您想要控制评估环境的原因是为了避免在评估中无意中使用程序中定义的任何变量。

的文档在我看来非常清楚,并给出了您需要的合理示例

基本上,您希望在字符串中保存要计算的表达式:

>>> f = 'x**2 + 2*x'
然后可以为
x
定义一个值:

>>> x = 3
最后,请致电评估:

>>> eval(f)
15
或者,与创建名为
x
的局部变量不同,如果您希望对eval的调用进行更严格的控制,则可以将参数中的求值环境传递到
eval()


您想要控制求值环境的原因是为了避免程序中定义的任何变量在求值过程中被无意中使用。

也许您正在考虑抽象语法树模块的“eval”模式,它允许您为单个表达式构造语法树

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

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


“sympy.integrate”函数进行符号集成。

也许您正在考虑抽象语法树模块的“eval”模式,它允许您为单个表达式构造语法树

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

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


“sympy.integrate”函数进行符号积分。

eval
在这里没有帮助。瞧,你是说这是有限的?这个链接有什么不清楚的地方?这是Python3还是2.x?
eval
在这里没有帮助。瞧,你是说这是有限的?这个链接有什么不清楚的地方?这是Python3还是2.x?还是为了防止一些小丑试图集成“x函数”
import sys;sys.exit()
@Li aungYip再多限制eval的输入也无法阻止这样的滥用。我假设这是一个个人项目,对恶意输入的担忧可以忽略不计。最好在幼年时教授防御编程。现在的
eval()
用户是明天的
用户,从表中选择*列=%s”%user\u input
@Li aung Yip原则上我同意。然而,我认为你需要先学会如何使用eval,然后才能学会如何滥用eval。在这里,答案中可以做的只有这么多。或者为了防止一些小丑试图集成“x的函数”
import sys;sys.exit()
@Li aungYip再多限制eval的输入也无法阻止这样的滥用。我假设这是一个个人项目,对恶意输入的担忧可以忽略不计。最好在幼年时教授防御编程。现在的
eval()
用户是明天的
用户,从表中选择*列=%s”%user\u input
@Li aung Yip原则上我同意。然而,我认为你需要先学会如何使用eval,然后才能学会如何滥用eval。答案里只有这么多可以做的。非常好的答案!让我想详细学习
ast
。回答得很好!让我想详细学习
ast