将Math.js类表达式转换为可运行的Python代码
我想把从 math.js 得到的一个字符串(比如 2*x^2+5x-1
)转换成一个可以在 Python 中运行的函数,像这样:
def f(x):
return 2*(x**2)+5*x-1
我尝试过使用 sympy
模块里的 sympify
方法:
from sympy import sympify, symbols
x = symbols("x")
expression = "x**2 + 3*x-1"
print(sympify(expression).subs(x, 2))
不过,这种方法在处理某些操作时,比如 ^
,就不太管用了,只能返回结果。此外,我还试过用 eval()
函数,但也遇到了类似的问题。
2 个回答
-1
你可以把数学表达式的字符串转换成一个 SymPy
表达式,然后把 ^
这个运算符换成 **
(这是Python中表示幂运算的符号),接着用 lambdify
创建一个Python函数 f(x)
。
从 sympy
导入 sympify
、symbols
和 lambdify
x = symbols("x")
expression_str = "2*x^2 + 5*x - 1"
expression_sym = sympify(expression_str.replace("^", "**"))
f = lambdify(x, expression_sym, 'numpy')
print(f(2)) # Evaluate the function at x = 2
输出结果:
17
2
SymPy里有一个内置的解析器,可以把字符串转换成SymPy表达式。你可以用像subs
或者lambdify
这样的函数来进行计算。
你还可以通过transformations
参数传递一些额外的解析规则,比如隐式乘法,也就是说像5x
这样的表达式会被理解为5*x
。完整的规则列表可以在这里找到。
from sympy import parse_expr
from sympy.parsing.sympy_parser import standard_transformations, implicit_multiplication_application
# tuple of transformations
transformations = (
standard_transformations +
(implicit_multiplication_application,))
s = '2*x^2 + 5x - 1'.replace('^', '**')
e = parse_expr(s, transformations=transformations)
# check object
print(e)
# 2*x**2 + 5*x - 1
print(type(e))
#<class 'sympy.core.add.Add'>