因此,我正在使用simpson 1/3方法制作一个积分器程序,我希望用户给我一个积分的函数和时间间隔,然后返回结果。我认为可以使用exec来制作动态代码,因此可以使用它来创建函数。这是我的代码:
from math import *
class CreaFormula:
def __init__(self,formula):
self.fun = "def f(x):\n return %s" % formula
class Integrador:
def __init__(self,f):
#integration interval
a = 0
b = 1
n = 600
h = (b-a)/n
#method
self.s = f(a) + f(b)
for i in range(1,n):
if i%2 == 0:
self.s = self.s + 2*f(a+i*h)
else:
self.s = self.s + 4*f(a+i*h)
self.s = self.s*(h/3)
vr = -cos(1) + e
self.er = abs((vr -self.s) /vr)
formula = input()
MiFo = CreaFormula(formula)
f1 = MiFo.fun
exec(f1)
MyInt = Integrador(f)
a = MyInt.s
b = MyInt.er
print(a)
因此,基本上我想将代码末尾的所有内容放入一个类中,以便稍后可以由另一个代码调用它,但是如果这样做,它会显示未定义f的错误,因为它是用exec创建。那么有没有办法不使用exec但仍然根据用户的输入创建函数?
预先感谢
答案 0 :(得分:1)
如果问题仅在于如何构造一个可以评估用户提供的表达式的函数对象,那么使用eval
比使用exec
可能会更轻松:
def create_function_from_formula(formula):
def user_function(x):
return eval(formula, globals(), {'x': x})
return user_function
当然,即使使用eval
,如果有人提供了恶意的formula
,它也可以执行所有操作,包括执行计算机上包含的任何其他程序。因此,只有在您相信提供formula
的人员可以接管您的计算机的情况下,才可以这样做。特别是,如果formula
可能来自尚未实际登录到您的计算机的用户,则应该从不执行此操作。