2012-02-20 4 views
-5

で関数を再考:関数がの多くを引き起こして、閉じたことがない:私はこのような仕事の4つの機能持って私のスクリプトでPythonの3

def function_four(): 
    # Does Stuff 
    function_one() 

def function_three(): 
    # Does Stuff 
    function_two() 

def function_one(): 
    usr_input = input("Options: '1') function_three | '2') Quit\nOption: ") 
    if usr_input == '1': 
     function_three() 
    elif usr_input == '2': 
     sys.exit() 
    else: 
     print("Did not recognise command. Try again.") 
     function_one() 

def function_two(): 
    usr_input = input("Options: '1') function_four | '2') function_three | '3') Quit\nOption: ") 
    if usr_input == '1': 
     function_four() 
    elif usr_input == '2': 
     function_three() 
    elif usr_input == '3': 
     sys.exit() 
    else: 
     print("Did not recognise command. Try again.") 
function_one() 

を、私はこれは私がそれをすると思う問題の原因になりますかどうかを知る必要がありユーザがスクリプトを終了するまで、決して消えることはありません(おそらく、無駄なメモリと最終的なスローダウン)。真の場合、これはおそらく悪い習慣であり、賢明ではないでしょう。これは代替手段が必要であることを意味します。

+8

コードを口頭で説明する代わりに表示できますか?また、機能3と機能4のポイントは何ですか? – tzaman

+1

これは何ですか、私は –

+0

@tzaman [ここに簡略化されたコードです](http://pastie.org/pastes/3422817/text)もありません。単に他の関数を呼び出すこととは別のことがありますが、この質問には重要ではありませんので、わかりやすくするために省略しました。 –

答えて

8

あなたはPythonのコードがあるとき:

Recalling The Same Function So That If The User Does Not Chose One Of The Other Statements Then They Can Try Again Rather Than The Program To Stop Working,

あなたは、ほとんどの場合、ループと再帰呼び出しを交換したほうが良いです。この場合、再帰はまったく不要で、おそらくリソースを無駄にし、おそらくコードの実行をより困難にします。

編集:コードを投稿したので、state machineとして再作成することをおすすめします。以下のページは、便利なPythonモジュールの概要を提供しています:link

でも任意の追加モジュールなしで、あなたのコードは、単純な非再帰的リライトに適していません:

import sys 

def function_four(): 
    # Does Stuff 
    return function_one 

def function_three(): 
    # Does Stuff 
    return function_two 

def function_one(): 
    usr_input = input("Options: '1') function_three | '2') Quit\nOption: ") 
    if usr_input == '1': 
     return function_three 
    elif usr_input == '2': 
     return None 
    else: 
     print("Did not recognise command. Try again.") 
     return function_one 

def function_two(): 
    usr_input = input("Options: '1') function_four | '2') function_three | '3') Quit\nOption: ") 
    if usr_input == '1': 
     return function_four 
    elif usr_input == '2': 
     return function_three 
    elif usr_input == '3': 
     return None 
    else: 
     print("Did not recognise command. Try again.") 
     return function_two 

state = function_one 
while state is not None: 
    state = state() 

注意機能は、もはやお互いを呼び出すこと。代わりに、それぞれが呼び出す次の関数を返し、最上位ループが呼び出しを処理します。

+0

また、そのようなことがあるときは、大文字と小文字が英語でどのように動作するかを調べる方がよいでしょう。また、テールコールの最適化をサポートする言語を使用している場合、これは成立しません。 –

+3

@NiklasB:正しく資本化するための学習に関しては、* English *という単語は大文字の* E *と表記されています。末尾再帰に関して、質問は特にPythonに関するものです。 – NPE

+0

"Touché"は、その最小のコメントサイズでない場合は私が答えていたものです。質問にPythonコードがなかったので、[python]タグを見逃しているはずですo.O –

関連する問題