2016-12-06 11 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'기능 없이는 수업 내 어디서나 사용할 수 있습니다.

이것은 내가 한 일이지만 '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 모듈은 임의 표현을 처리하기 위해 심도에 크게 의존합니까? – jwdasdk

+0

'sympify'가'eval'을 사용한다는 정보만을 발견했습니다. 더 많은 정보가 필요하다면 소스 코드를 확인해야합니다. SymPy 페이지에 코드에 대한 링크가 있습니다. 'eval'을 원하지 않으면 파서를 만들어야합니다 - [PLY] (http://www.dabeaz.com/ply/)를 사용할 수 있지만 더 많은 작업이 필요합니다. – furas