gpt4 book ai didi

Python 3.5 如何摆脱类函数中的 eval

转载 作者:行者123 更新时间:2023-12-01 03:30:28 25 4
gpt4 key购买 nike

我有一个名为 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))

Parsing

Basic OperationsSympify

关于Python 3.5 如何摆脱类函数中的 eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40992077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com