2017-08-02 72 views
0

我正在研究一個實驗項目(創建一個基本的謎機器機制),並且在重新分配變量時遇到了一個問題。我有一個「檢查」函數,用於檢查用戶輸入的值是1到26之間的數值,如果不是,它會再次調用輸入函數,要求一個新值。如果我輸入一個介於1和26之間的數字(例如:4),一切正常,但是,如果我輸入29或「qwerty」,它會開始混亂。它再次調用輸入函數(如預期的那樣),如果我然後輸入4作爲值,則變量被賦值爲「無」。爲什麼這個值被設置爲None?

我該如何解決這個問題?它

CLI輸出工作時(例如:輸入4):

What is the message you would like to encrypt?as 
For the next 3 questions, please input ONLY a number from 1 to 26 
What is the first key value?4 
4 

它CLI輸出失敗時(例如:輸入28然後4):

What is the message you would like to encrypt?asd 
For the next 3 questions, please input ONLY a number from 1 to 26 
What is the first key value?28 
You must input a number between 1 and 26! 
What is the first key value?4 
None 

代碼:

class Input: 

    def message(): 
     msg = input("What is the message you would like to encrypt?") 
     msg = msg.upper() 
     print("\n For the next 3 questions, please input ONLY a number from 1 to 26") 

    def check(input): 
     try: 
      if int(input) < 1 or int(input) > 26: 
       return False 
      else: 
       return True 
     except: 
      return False 

    def getKey(keyNum): 
     word = "" 
     if keyNum == 1: 
      word = "first" 
     elif keyNum == 2: 
      word = "second" 
     else: 
      word = "third" 

     s = input("What is the {} key value?".format(word)) 
     chk = Input.check(s) 
     if chk: 
      return(s) 
     else: 
      print("You must input a number between 1 and 26!") 
      Input.getKey(1) 

inp = Input 
inp.message() 
s1 = inp.getKey(1) 
print(s1) 
+0

後您解決問這裏的問題,你可能要頭以上[ codereview.SE]來獲得關於構造代碼的一些常規技巧。 –

回答

0

你已經創建的類名Input所以它的類的函數應該在他們的第一個參數自也呼籲從內部功能相同的功能,我們將通過self.name函數中調用它,這樣它不會調用其他功能對於其他變量,但當下。
有一個小錯誤叫Input.getKey(1),它應該正確地提供當前密鑰self.getKey(keyNum)

class Input: 

    def message(self): 
     msg = input("What is the message you would like to encrypt?") 
     msg = msg.upper() 
     print("\n For the next 3 questions, please input ONLY a number from 1 to 26") 

    def check(self,input): 
     try: 
      if int(input) < 1 or int(input) > 26: 
       return False 
      else: 
       return True 
     except: 
      return False 

    def getKey(self,keyNum): 
     word = "" 
     if keyNum == 1: 
      word = "first" 
     elif keyNum == 2: 
      word = "second" 
     else: 
      word = "third" 

     s = input("What is the {} key value?".format(word)) 
     chk = self.check(s) 
     if chk: 
      return s 
     else: 
      print("You must input a number between 1 and 26!") 
      return self.getKey(keyNum) 

inp = Input() 
inp.message() 
s1 = inp.getKey(1) 
print(s1) 

在一個類變量調用成員函數的正確方法here

看到它的工作here

+0

我試圖按照你所建議的方式使用self,將它添加到參數中,但是現在我得到錯誤「TypeError:message()missing 1 required當我嘗試調用該函數時,位置參數:'self'「。 – Trilliante

+0

@Trilliante試試看,我編輯了答案。順便說一下,這是使用類時的正確實現。查看答案的最後一個鏈接來檢查。 –

+0

啊,它似乎沒有工作,因爲我有「INP =輸入」而不是「INP =輸入()」 – Trilliante

0

問題來自您的getKey()功能:

def getKey(keyNum): 
    ... 
    chk = Input.check(s) 
    if chk: 
     return(s) 
    else: 
     print("You must input a number between 1 and 26!") 
     Input.getKey(1) 

如果第一次致電Input.check(s)返回True,則getKey()返回輸入的值。但是,如果第一個電話返回False,則getKey()不會返回任何內容。它會再次請求輸入,但是它不會將輸入返回到需要它的代碼。您需要做的是將一個適當的return語句添加到else塊,以便返回來自遞歸調用getKey()的值。

0

在你的代碼在這裏:

if chk: 
     return(s) 
    else: 
     print("You must input a number between 1 and 26!") 
     Input.getKey(1) 

chk是 「truthy」 - 也就是說,當if chk:成功 - 你做的s回報。

但是,當運行else:時,您不會返回任何內容。相反,你遞歸到getKey(1)(這是錯誤的 - 如果它是2或3,你應該使用參數)。

現在,遞歸調用getKey(1)將返回一個值。但是你忽略了這個價值,不要回報。由於你沒有返回到那個分支,所以你「落在」了函數的末尾,在這裏Python的默認機制開始了:如果一個函數沒有返回任何值,Python自動提供一個None作爲結果。

這就是你在else:的情況下得到的結果。

+0

閱讀https://stackoverflow.com/a/25825737/4465743 –

相關問題