2016-12-06 7 views
1

NumApproxという名前のクラスがあります。これは入力として文字列をとります(変数 'x'を含む数式)。その中のすべてのメソッドは全く異なりますapproachsは「X」の数値所定の演算式を統合するPython 3.5クラス関数の評価を取り除く方法

予想入力例:

input = " x ** 2 * log(x) " 

    input = "1/sqrt(2*pi) * exp(- x **2/2) " 

私が分離した文字列入力によって提供される「X」変数の制御を取ることができるか疑問ました私のクラス内のどこからでも '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): 
     ... 
+1

'eval'を使わずに任意の式を評価したいのであれば、ある種のパーサーを調べる必要があるでしょう。 – Iluvatar

+0

[SymPy](http://www.sympy.org/)のようなモジュールを使うのが好ましい – furas

+0

'self.expr.replace( 'x'、 'self.x')'は、 'expr'は' exp(x) 'ですか? – donkopotamus

答えて

2

はたぶんモジュールを使用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

+0

提案とデモをお寄せいただき、ありがとうございます。 SymPyモジュールは、任意の式を処理するために、evalsに大きく依存していますか? – jwdasdk

+0

'sympify'が' eval'を使うという情報だけが見つかりました。より多くの情報が必要な場合は、ソースコードを確認する必要があります - SymPyページにコードへのリンクがあります。 'eval'を望んでいなければ、パーサーを作る必要があります - あなたは[PLY](http://www.dabeaz.com/ply/)を使うことができますが、もっと多くの作業が必要です。 – furas

関連する問題