2013-02-09 5 views
0

그래서 내가 integral(function, n=1000, start=0, stop=100)nums.py에 정의 된 함수가 (구문 모두 호환) :프로그램은 파이썬 2.7에서 작동,하지만 파이썬 3.3

def integral(function, n=1000, start=0, stop=100): 
    """Returns integral of function from start to stop with 'n' rectangles""" 
    increment, num, x = float(stop - start)/n, 0, start 
    while x <= stop: 
     num += eval(function) 
     if x >= stop: break 
     x += increment 
    return increment * num 

그러나, (내 프로그래밍 클래스) 선생님이 우리가 원하는을 별도의 프로그램을 작성하여 input()을 사용하여 입력을 얻은 다음이를 리턴하십시오. 그래서, 내가 가진 : 파이썬 2.7에서 실행하면 잘 작동

def main(): 
    from nums import integral # imports the function that I made in my own 'nums' module 
    f, n, a, b = get_input() 
    result = integral(f, n, a, b) 
    msg = "\nIntegration of " + f + " is: " + str(result) 
    print(msg) 

def get_input(): 
    f = str(input("Function (in quotes, eg: 'x^2'; use 'x' as the variable): ")).replace('^', '**') 
    # The above makes it Python-evaluable and also gets the input in one line 
    n = int(input("Numbers of Rectangles (enter as an integer, eg: 1000): ")) 
    a = int(input("Start-Point (enter as an integer, eg: 0): ")) 
    b = int(input("End-Point (enter as an integer, eg: 100): ")) 
    return f, n, a, b 

main() 

:

>>> 
Function (in quotes, eg: 'x^2'; use 'x' as the variable): 'x**2' 
Numbers of Rectangles (enter as an integer, eg: 1000): 1000 
Start-Point (enter as an integer, eg: 0): 0 
End-Point (enter as an integer, eg: 100): 100 

Integration of x**2 is: 333833.5 

을하지만, 파이썬 3.3 (선생님은 우리가 사용 주장하는)에, 내 integral에 오류가 발생합니다 같은 정확한 입력과 기능 : (파이썬 3.3) 자체 또한

Traceback (most recent call last): 
    File "D:\my_stuff\Google Drive\documents\SCHOOL\Programming\Python\Programming Class\integration.py", line 20, in <module> 
    main() 
    File "D:\my_stuff\Google Drive\documents\SCHOOL\Programming\Python\Programming Class\integration.py", line 8, in main 
    result = integral(f, n, a, b) 
    File "D:\my_stuff\Google Drive\Modules\nums.py", line 142, in integral 
    num += eval(function) 
TypeError: unsupported operand type(s) for +=: 'int' and 'str' 

, integral 잘 작동합니다 :

>>> from nums import integral 
>>> integral('x**2') 
333833.4999999991 

덕분에 내 잘못이 내 수업에 있다고 생각합니다. 모든 도움이 인정됩니다. 감사합니다 :)

답변

4

당신이로 실행중인 문제는 raw_input이하는 것처럼 파이썬 3에서 파이썬이 파이썬 3에서 다른 input 작품의 input 기능 2의 input 기능 eval(input())에 해당 파이썬 2에서 파이썬을 작동한다는 것입니다 Python 3에서.

수식에 입력하는 인용 부호로 인해 문제가 발생합니다. Python 2에서 실행될 때 'x**2' (따옴표 포함)을 수식으로 입력하면 이라는 문자가 이되고 결과로 따옴표가없는 문자열이 표시됩니다. 이 작동합니다.

파이썬 3의 input 함수에 같은 문자열을 줄 경우 eval을 사용하지 않으므로 따옴표는 그대로 유지됩니다. 나중에 eval 수식 계산의 일부로 수식을 사용하면 문자열 x**2 (따옴표없이)을 x의 값이 아닌 제곱 한 결과가됩니다. 문자열을 0으로 시도하면 예외가 발생합니다.

# ensure we have Python 3 semantics from input, even in Python 2 
try: 
    input = raw_input 
except NameError: 
    pass 

을 그럼 그냥 입력 :

는 나도 두 버전의 파이썬 3 스타일 input를 얻기 위해 파이썬의 한 버전을 사용하거나 파일의 맨 위에 다음 코드를 넣어 제안,이 문제를 해결하려면 인용 부호없이 수식에서 올바르게 작동합니다.