2014-05-24 2 views
-1

헤이 그래서 난 내 코드는 다음 내 문제에 이동과 내가 시작됩니다 같아요 입력 한 ^을 **로 바꾸는 방법은 무엇입니까?

def trapezoidal(a, b, deltax, func = None): 

func = lambda x: (raw_input("Enter a function to have a trapezoidal approximation taken  
of. Enter it in the form a*x^m + b*x^n + c*x, a*x^m +c, etc. (ex. 3*x^3 + 4*x^2...) ") 

h = float(b - a)/deltax 
s = 0.0     
s += func(a)/2.0 
for i in range(1, deltax): 
    s += func(a + i*h) 
s += func(b)/2.0 
return s * h 

기본적으로 나는이 사용자에게 친숙 수 있도록 노력하고 있습니다. 내가해야 할 일은 raw_input의 ^를 **로 대체하여 람다가 그것을 평가할 수 있도록하는 것입니다. 궁극적으로 a, b 및 delta x에 대한 값을 입력하고 Enter 키를 누르고 일반 표기법에 가까운 값을 사용하여 함수를 입력하려고합니다 (** 대신 ** 사용). 나는 이것이 어리석은 무의미한 것처럼 보일지 모른다. 그러나 사용자 편의는 필수 다. 나는 사용자가 계수와 변수 사이에 a *를 넣어야하는 것을 없애기를 원할 것이다. (바람직하게는 3x^2는 3 * x ** 2로 평가 될 것이다.) 그런 다음 람다에 연결하고 나머지는 . 그것은 내가 단순히

def trapezoidal(a, b, deltax, func): 

h = float(b - a)/deltax 
s = 0.0     
s += func(a)/2.0 
for i in range(1, deltax): 
    s += func(a + i*h) 
s += func(b)/2.0 
return s * h 

trapezoidal(5, 10, 100, lambda x: 3*x**2 + 2*x) 

에 넣을 수 있습니다 그것은 좋은 평가 실현 실행 그러나 그것은 쉬운 사용자가 아닌 소스 파일의 시작 부분에서

+1

(나는 태그를 추가)하지만, 들여 쓰기가 꺼져 당신은 짝 괄호가 있습니다. 다른 사람에게보기 전에 구문 적으로 유효하도록 코드를 편집하십시오. – tripleee

+2

함수 인수'func'는 처음부터 겹쳐 쓰여 지므로 현재 쓸모가 없습니다. 어쩌면 당신은 그것이 설정되지 않은 경우에만 입력을 요청해야합니까? 또는 발신자에게 메시지를 표시하게하십시오. 대화식 호출 기능은 종종 좋은 디자인이 아닙니다. – tripleee

답변

-1

내가 문제를 해결하는 방법입니다

이 파이썬 코드처럼 보이는
def trapezoidal(a, b, deltax, func = None): 

#first we find the height using our range divided by deltax 

h = float(b - a)/deltax 

''' 
next we find start to calculate the sum; set s to 0 to make it start at 0 
we divide func(a) by two, because of the area of trapezoid 1/2(b1 + b2)h 
next use a for loop to evaluate the b1 + b2 
s is basically the 1/2(b1 + b2), then we multiply it by h, the height. 
tr ''' 
s = 0.0     
s += func(a)/2.0 
for i in range(1, deltax): 
    s += func(a + i*h) 
s += func(b)/2.0 
return s * h 

    ''' 
    next we are going to get our values for a, b, and deltax 
    we must use eval(func) to use the lambda x:. 
    it then runs through trapezoidal() 
    ''' 
def userexp(): 
    a = int(raw_input("Enter your a ")) 
    b = int(raw_input("enter your b ")) 
    deltax = int(raw_input("enter your deltax ")) 
    func = raw_input("Enter your function as a*x**n + b*x**m.. ex 3*x**3 + 5*x**2 ") 
    return trapezoidal(a, b, deltax, lambda x: eval(func)) 
+1

**이 문제는 ** 해결되지 않았습니다. 코드도 올바르지 않습니다. 만약 당신이 _optional_ 인자'func'을 전달하지 않으면, 충돌 할 것입니다. – Davidmh

1

:..

import re 

변경 raw_input 전화 :

re.sub(r'([\d])x', r'\1*x', raw_input("Enter a function...")).replace('^', '**') 

설명 : re.sub 정규 표현식 대체를 수행합니다. 이 경우에, 당신은 위치 :

  • x

다음에 괄호 ([\d])

  • 에 둘러싸 그룹 1에 숫자를 캡처 숫자 [\d]
  • 교체
    • 같은 자릿수 별표 *
    • 다음에 1 군 \1
    • 의 냈다는 사실은 우리가 간단한 str.replace 호출 **^의 모든 인스턴스를 교체, 마지막으로 x

    하였다.


    그러나 실제로는 tripleee says으로 이것은 기능을 실제로 평가하기에 충분하지 않습니다. 이는 제목과 질문의 첫 부분에 설명 된 텍스트 조작 문제 만 수행합니다. 실제로 텍스트를 함수로 평가하는 것은 별개의 문제입니다.

  • 0

    func은 문자열입니다. Python 표현식으로 실행하려면 eval해야합니다. 그렇게하기 전에 원하는 문자열 조작을 수행 할 수 있습니다.

    func = raw_input() 
    func.replace('^', '**') 
    # TODO: valudation here 
    f = eval(func) 
    

    eval 전에 예상되는 입력 형식과 일치하는지 확인해야합니다. 그렇지 않으면 코드에 거대한 보안 취약점이 있습니다.여기

    관련 문제