我有一个名为 NumApprox 的类,它接受一个字符串作为输入(包含变量“x”的数学表达式),其中的所有方法只是在给定“x”数值的情况下整合数学表达式的不同方法
预期输入示例:
input = " x ** 2 * log( x ) "
input = "1 / sqrt(2*pi) * exp(- x **2 / 2) "
我想知道如何隔离和控制字符串输入提供的“x”变量,并在没有“eval”函数的情况下从类中的任何位置使用它。
这就是我所做的,但我不喜欢“eval”函数,并且鉴于我对 Python 类的了解有限......我想知道“eval”是否有更好的替代方案?
from math import pi, sqrt, exp, log
class NumApprox:
def __init__(self, expr):
self.expr = expr
def pdf(self, x):
self.x = x
self.ev = eval( self.expr.replace('x', 'self.x') )
return self.ev
def integrate_rect_method(self, A, B, n):
...
最佳答案
也许使用模块 SymPy
from sympy import *
from sympy.parsing.sympy_parser import parse_expr
x, y, z = symbols("x y z")
input = " x ** 2 * log( x ) "
#expr = sympify(input) # `sympify` uses `eval`
expr = parse_expr(input)
print(expr)
print(expr.subs({x:2}))
input = "1 / sqrt(2*pi) * exp(- x **2 / 2) "
#expr = sympify(input) # `sympify` uses `eval`
expr = parse_expr(input)
print(expr)
print(expr.subs({x:2}))
结果:
x**2*log(x)
4*log(2)
sqrt(2)*exp(-x**2/2)/(2*sqrt(pi))
sqrt(2)*exp(-2)/(2*sqrt(pi))
关于Python 3.5 如何摆脱类函数中的 eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40992077/