2016-07-25 5 views
0

私はPython Hangmanミニプロジェクトを完成させてコードの学習を手伝っています。2回目に呼び出された後に関数が値を返さない

私はうまくいけば、手紙を尋ねる機能を作りました。手紙が1文字だけで、数字でないことを確認します。最初の入力が正しい場合

def getLetter(): 
    letter = raw_input('Please enter a letter...') 

    if letter.isdigit() == True: 
     print('That is a number!') 
     getLetter() 

    if len(str(letter)) >1: 
     print("Sorry, you have to enter exactly ONE letter") 
     getLetter() 

    else: 
     return letter 

これはすなわち、正常に動作します:ここで

は、私がこれまで持っているコードです。 1文字しかし、入力が間違っている場合(例えば 'ddddd')、プログラムは別の文字を入力するように要求するが、新しい入力ではなく最初の入力( 'ddddd')を返すか、全く何も返さない。

新しい入力を返すにはどうすればよいですか? raw_inputをクリアする必要がありますか?もしそうなら、どうですか?

+1

再帰は、入力を検証するための最良の方法ではありません。あなたのプログラムを中断するユーザの力を過小評価してはいけません。この場合、無効な入力を何度も入力するので、最大の再帰深度に達します。ループは、入力の検証にははるかに優れたオプションです。 – DeepSpace

+1

再帰はとても間違っていると感じます。あなたの例に従うのは混乱します。私はループがより良い選択肢だと思います。あなたは 'return'を忘れています –

+0

John Doeに追加すると、上のコードを使うつもりなら、if文の中に' return'を加えて 'return getLetter()'にしてください。 – Newyork167

答えて

4

再帰呼び出しの結果は返されません。どこでもgetLetter()あなたはのドロップの戻り値を呼び出します。あなたはすべてので再帰を使用すべきではない、しかし

return getLetter() 

;:

結果アップに呼び出しチェーンを渡すために、それらの呼び出しの前にreturnを追加します。

def getLetter(): 
    while True: 
     letter = raw_input('Please enter a letter...') 

     if letter.isdigit() == True: 
      print('That is a number!') 
      continue 

     if len(str(letter)) >1: 
      print("Sorry, you have to enter exactly ONE letter") 
      continue 

     return letter 

すべての再帰呼び出しがサイズに制限はありません。最終的に数字を入力するユーザーは、あなたのプログラムを壊すでしょう!詳細については、Asking the user for input until they give a valid responseを参照してください。

0
def get_valid_letter():  
    while True: 

     letter = raw_input('Please enter a letter...') 
     if letter.isdigit() == True: 
      print('That is a number!') 

     elif len(str(letter)) >1: 
      print("Sorry, you have to enter exactly ONE letter") 

     else: 
      return letter 
関連する問題