2017-10-11 52 views
2

我的代碼應該爲用戶打印一個菜單,讓他們選擇一個選項,並根據他們選擇的選項,他們輸入一個具有一定基數的數字。我需要一個函數來收集他們的選擇,一個函數在他們輸入一個選擇後收集他們的號碼,一個函數驗證他們的號碼是否在正確的基礎上。我一直收到一個錯誤,因爲我在其中一個函數中聲明的變量「userChoice」在我嘗試在main中使用時是「未定義的」。我怎樣才能解決這個問題?在其他函數中聲明的變量在主python 3中不起作用?

def printmenu(userChoice): 
    flag = True 

    while(flag == True): 
     print("Enter 2 for base 2") 
     print("Enter 8 for base 8") 
     print("Enter 16 for base 16") 
     userChoice = input("Enter 0 to stop: ") 

     if userChoice not in ["2", "8", "16", "0"]: 
      print("Invalid choice\n") 
      flag = True 
     else: 
      flag = False 
    return(userChoice) 

def askUserValue(): 
    flag2 = False 

    while(flag == True): 
     base2 = input("Enter a base 2 number: ") 

     flag2 = validateInput(base2) 

    newBase2 = base2 
    return (newBase2) 


def isbase2(base2): 

    try: 
     base2 = int(input("Enter a base 2 number" , 2)) 
     flag1 = False 
     return (True) 
    except ValueError: 
     flag1 = True 
     return (False) 
    else: 
     flag1 = True 
     return (False) 

def main(): 

    if (printmenu(userChoice) == "2"): 
     askUserValue() 


main() 
+0

爲什麼你hav e userChoice設置爲printmenu的參數,當它在方法內創建時? – Pintang

+0

在Python中沒有變量聲明... –

+1

btw在python中不需要太多的括號。你的'if',''while'和'return'語句不需要括號的外層。 – quamrana

回答

2

得到你擺脫參數的像下面printmenu()方法:

def printmenu(): 
    flag = True 

    while(flag == True): 
     print("Enter 2 for base 2") 
     print("Enter 8 for base 8") 
     print("Enter 16 for base 16") 
     userChoice = input("Enter 0 to stop: ") 

     if userChoice not in ["2", "8", "16", "0"]: 
      print("Invalid choice\n") 
      flag = True 
     else: 
      flag = False 
    return(userChoice) 

然後就可以調用它的主:

if (printmenu() == "2"): 
    askUserValue() 
0

問題與python如何使用變量有關,變量與其他語言中的對象不一樣。 python中的變量只是引用,所以在函數中聲明它們實際上並不會轉移到主範圍。我如何解決這個問題是我在main中聲明該變量,並將其設置爲等於我正在運行的函數。

userChoice = printmenu() 
+1

「我如何解決這個問題」......是不是值得學習它如何在python中實際工作?這不是一個錯誤。 – roganjosh

+1

我不確定你的意思是「變量與其他語言中的對象不一樣,Python中的變量只是引用」,問題在於Python範圍規則,而不是變量*賦值的語義*(注意,那裏在Python中沒有變量聲明)本身。 –

0

使用可變長度參數:

def printmenu(*args): 
    flag = True 

    while(flag == True): 
     print("Enter 2 for base 2") 
     print("Enter 8 for base 8") 
     print("Enter 16 for base 16") 
     userChoice = input("Enter 0 to stop: ") 

     if userChoice not in ["2", "8", "16", "0"]: 
      print("Invalid choice\n") 
      flag = True 
     else: 
      flag = False 
    return(userChoice) 

並使用返回結果如thi S:

def main(): 

    if printmenu() == "2": 
     askUserValue() 


main() 

第二個選項:

單從功能刪除參數和參數如下:

def printmenu(): 
    flag = True 

    while(flag == True): 
     print("Enter 2 for base 2") 
     print("Enter 8 for base 8") 
     print("Enter 16 for base 16") 
     userChoice = input("Enter 0 to stop: ") 

     if userChoice not in ["2", "8", "16", "0"]: 
      print("Invalid choice\n") 
      flag = True 
     else: 
      flag = False 
    return(userChoice) 

和使用這樣的函數的返回值:

def main(): 

    if printmenu() == "2": 
     askUserValue() 


main()