2012-04-04 76 views
0

我正在寫一個python計算器,這裏是代碼:Python的功能將不會啓動

#Python Calculator 

import sys; 
import cmath; 

def plus(): 
    num1 = float(input("Input the first number: ")); 
    num2 = float(input("Input the second number: ")); 
    ans = (num1 + num2); 
    print(ans); 
    exit(); 
    return; 

def minus(): 
    num1 = float(input("Input the first number: ")); 
    num2 = float(input("Input the second number: ")); 
    ans = (num1 - num2); 
    print(ans); 
    exit(); 
    return; 

def divide(): 
    num1 = float(input("Input the first number: ")); 
    num2 = float(input("Input the second number: ")); 
    ans = (num1/num2); 
    print(ans); 
    exit(); 
    return; 

def multiply(): 
    num1 = float(input("Input the first number: ")); 
    num2 = float(input("Input the second number: ")); 
    ans = (num1 * num2); 
    print(ans); 
    exit(); 
    return; 

def power(): 
    num1 = float(input("Input the number: ")); 
    num2 = float(input("Input the power: ")); 
    ans = cmath.pow(num1, num2); 
    print(ans); 
    exit(); 
    return; 

def square(): 
    num1 = float(input("Input the number: ")); 
    ans = cmath.sqrt(num1); 
    print(ans); 
    exit(); 
    return; 

def inputs(): 
    print("Select which function you would like to use:"); 
    print("1 for Plus"); 
    print("2 for Minus"); 
    print("3 for Divide"); 
    print("4 for Multiply"); 
    print("5 for Power"); 
    print("6 for Square Root"); 
    func = input(); 

    if func == 1: 
     plus(); 
    elif func == 2: 
     minus(); 
    elif func == 3: 
     divide(); 
    elif func == 4: 
     multiply(); 
    elif func == 5: 
     power(); 
    elif func == 6: 
     square(); 
    return; 

def exit(): 
    exit = str(input("Run again? y/n: ")); 
    if exit == "Y" or exit == "y": 
     inputs(); 
     print (""); 
    elif exit == "N" or exit == "n": 
     sys.exit(); 
    else: 
     exit(); 
    return; 

print ("Python Calculator"); 
print(""); 
inputs(); 

現在的問題是,一旦你輸入你想要運行的功能,該程序只關閉。我對python相對來說比較新,但不適合編程。這種編碼的方式也是錯的(即馬虎編碼),請告訴我。

+6

你知道你並不需要把分號在每個字符串的結束,你不是嗎? – 2012-04-04 10:47:38

+0

你也不需要在每個函數的末尾都顯式返回'return'。從函數返回當它到達最後時會發生什麼。另外,在從exit()調用'inputs()'的時候,它會工作一段時間,這很麻煩,並且暗示了對函數的工作原理的進一步誤解。 – 2012-04-04 10:56:41

+0

無論如何,爲了找出程序實際發生了什麼問題,您應該從一個已經存在的命令窗口(當程序退出時不會關閉)運行它。 – 2012-04-04 10:57:49

回答

4

您的輸入可能是字符串(例如"6")而不是數字6

一般而言,我認爲你的代碼是不必要的長,並打破了Don't Repeat Yourself的原則。對於初學者來說,你可以在一個地方要求這兩個號碼,然後調用相關功能來執行相關操作。

更簡潔的設計將使用Python運營商:

funcs=[operator.add, operator.sub, operator.div, 
     operator.mul, operator.pow, your_square_function] 

你可以要求函數類型,然後調用相關功能(見利的答案)。

有趣的情況是sqr,它採用一個參數,而不是兩個。這可以通過指定每個函數需要的參數個數來解決:

funcs=[(operator.add, 1), (operator.sub, 2), (operator.div, 2), 
     (operator.mul, 2), (operator.pow, 2), (your_square_function, 1)] 

的解決方案是現在簡單 - 索要功能號,索要的觀點的權利數量,並調用funcs[input_number][0]

這個想法可以加以闡述,從而使功能名稱也存儲:

funcs=[("Plus", operator.add, 1), ("Minus", operator.sub, 2), 
     ("Divide", operator.div, 2), ("Multiply", operator.mul, 2), 
     ("Power", operator.pow, 2), ("Square root", your_square_function, 1)] 

現在你的程序應該像(僞):

for f in funcs: 
     print id, function_name 
ask for id 
ask for relevant number of arguments 
run funcs[id] with relevant number of arguments 
+1

非常感謝,python將「func」變量作爲一個字符串輸入,所以已經修復了這個程序,現在我需要按照您的建議開發一個更好的設計。再次謝謝你! – jambolina 2012-04-04 11:16:30

+0

你已經選擇了正確的語言 - 你會驚訝你的代碼會是多麼簡短和可讀。 – 2012-04-04 11:28:27

0

正如亞當指出,問題是您不會將func轉換爲int。 既然你還請教有關代碼組織,我可以建議如下襬脫堆疊elif條款:

functions = [plus, minus, divide, multiply, power, square] 
try: 
    func = int(input()) 
    functions[func-1]() 
except: 
    print("Please choose an existing function number.") 
    exit() 
+0

這可以擴展到運營商 - 請參閱我的答案。 – 2012-04-04 10:57:25

+3

我會謹慎建議一個python新角色使用'except all'。 – MattH 2012-04-04 10:57:41

+0

@MattH你會寫'except(ValueError,IndexError)'嗎? – 2012-04-04 11:01:45