2016-11-22 7 views
4

私はR.PiでPythonを学んでいます。次のコードでは、 "inputchecker"関数を "getinput"関数に戻している間にメモリに開いたままにしておくと思われます。ネスト機能はPythonicですか?

このコードは悪いですか?それは非常に異なって行われるべきですか?

def getinput(i):  
    if i == 1: 
     first = input("Would you like A or B? ") 
     inputchecker(1, first) 
    elif i == 2: 
     second = input("Would you like C or D? ") 
     inputchecker(2, second) 

def inputchecker(n, userinput):  
    def _tryagain_(n): 
     usage(n) 
     getinput(n)   
    if n == 1: 
     if userinput in ("A", "B"): 
      print("You chose wisely.") 
      getinput(2) 
     else: 
      _tryagain_(n) 
    elif n == 2: 
     if userinput in ("C", "D"): 
      print("You chose wisely.") 
     else: 
      _tryagain_(n) 

def usage(u): 
    if u == 1: 
     print("Usage: Just A or B please.") 
    if u == 2: 
     print("Usage: Just C or D please.") 


getinput(1) 
+0

「神託」であることをプログラミングimperitaveに固執するだろうが、これはのみのpythonに限定されるものではありません。すべての言語がこの「ハック」をサポートしています。 whileループを関数に入れるのに十分な頻度で頻繁に使用しない限り、whileループを使用するのが最善です。 – ProgramFast

答えて

2

いいえ、ネストされた関数の名前getinputは参照を作成しません。それはグローバルなので、_tryagain_が呼び出されるたびに検索されます。これは問題ではありません。Pythonが終了したときにモジュール全体がクリアされるので、ここでメモリリークが発生する可能性はまったくありません。

ただし、再帰を使用してユーザーに入力を求めているため、コードをフォローするのは難しいです。代わりに単純なループを使用してください。Asking the user for input until they give a valid responseを参照してください。

+0

偉大なフィードバックありがとうございます。私は今、より多くの方向性を持っています。 – Benjo

1

2つの関数を無限に呼び出すことは、実際には最適な制御フローではありません。それは

def getinput(i): 
    while i:  
     if i == 1: 
      first = input("Would you like A or B? ") 
      i = inputchecker(1, first) 
     elif i == 2: 
      second = input("Would you like C or D? ") 
      i = inputchecker(2, second) 

def inputchecker(n, userinput):   
    if n == 1: 
     if userinput in ("A", "B"): 
      print("You chose wisely.") 
      return 2 
     else: 
      getusage(i) 
      return i 
    elif n == 2: 
     if userinput in ("C", "D"): 
      print("You chose wisely.") 
     else: 
      getusage(i) 
      return i 

あなたは、単一の関数にそれを簡略化した場合、それはおそらく良いだろうwhileループと良いだろう。分割する必要はありません。

0

私は確かに再帰呼び出しを避けるでしょう。また、検証関数が次の質問の番号の代わりにブール値を返すようにします。とにかく質問をすると、あなたのコードの読者にとってはそれだけが複雑になるようです。

また、私は常に戻り何かを検証してみましょうだろう - あなたが知っていることはありません:最初の引数が間違っているにもあるかもしれない:Pythonは行うことができますが:

def getinput(): 
    valid = False 
    while not valid: 
     first = input("Would you like A or B? ") 
     valid = inputIsValid(1, first) 
    valid = False 
    while not valid: 
     second = input("Would you like C or D? ") 
     valid = inputIsValid(2, second) 
    return [first, second] 

def inputIsValid(n, userinput):  
    valid = False 
    if n == 1: 
     valid = userinput in ("A", "B") 
    elif n == 2: 
     valid = userinput in ("C", "D") 
    if valid: 
     print("You chose wisely.") 
    else: 
     usage(n) 
    return valid 

def usage(u): 
    if u == 1: 
     print("Usage: Just A or B please.") 
    elif u == 2: 
     print("Usage: Just C or D please.") 

getinput() 
-1

は「神託」であなたの質問に答えるためにそれはnot designedです。構文は少し不合理で、一部の言語にはfeaturesがありません。欠落しているフィーチャの中には、再帰がslowであることがあります。

だから、私はそれがif文不測の真の問題を引き起こす可能性がありますように、それは正確にニシキヘビではありません

+0

これは関数型プログラミングと何が関係していますか?コード*は必須です。ここにはテール再帰はありません。すべての再帰コードが機能コードであるとは限りません。 –

関連する問題