2016-11-12 6 views
0

関数から別の関数に返される値(常にランダムまたは異なる値)を渡す必要がある状況に陥りました。ユーザ入力に基づいて実行時に計算されるため、関数は呼び出されません。例えば関数から返されたランダムな値を別の関数に渡します。

def func1(some_value): 
    # Use some_value for whatever purpose 
    # Some code 
    return some_random_value 

def func2(some_value): 
    # Use some_value for whatever purpose 
    # Some code 
    return some_random_value 

def func3(some_value): 
    # Use some_value for whatever purpose 
    # Some code 
    return some_random_value 

だから func2が最初に呼び出された場合のはと仮定しましょう、任意の初期/デフォルト値はパラメータ some_valueとして渡され、関数は some_random_valueを返します。今、どの関数が次に呼び出されるのかわかりませんが、前の関数(この場合は func2)から返された some_random_valueと呼ばれる関数は、次の関数にパラメータ some_valueとして渡されます( func1とする)。そして、このプロセスは繰り返します。

これを達成するための推奨方法は何ですか?これは、関数の戻り値を格納するために関数が実行されるたびに値が修正されるグローバル変数を使用して行う必要がありますか?はいの場合は、どうですか?

具体

A CLIは、いくつかのアクションと適切な機能を選択するため、ユーザは、この操作に応じて呼び出されることを可能にします。関数から最後に返された値は、アプリケーションが終了するまでメモリ内になければなりません。関数がそのタスクを実行すると、値を返します。この値は、CLIアクションを使用して他の関数を呼び出す場合に必要です。ここでもまた、次の関数は最後の関数の戻り値を使用してデータを処理し、次に処理された値を返します。これは後で次の関数またはCLIアクションで使用されます。

common_data = 'some string' 

そして、すべての関数定義では、追加します:

global common_data 
common_data = 'new processed string' 

私はそれらの機能のいずれかから値を返す代わりのように考えていた、デフォルト値を持つグローバル変数を作成します

これは、次の関数呼び出しが、前の関数によってcommon_dataに最後に保存された値を確実に渡すようにします。

しかし、これはお勧めではないようですが、少なくとも私はそう考えています。

私の状況を適切に説明できない場合は、この質問を編集したり、手直ししてください。

ありがとうございました

+0

1つの関数の戻り値を次の関数呼び出しに渡すだけで何が問題になりますか?それはあなたが望むものを正確に実行していると思われ、呼び出し元によって順序が決定されます。 – UnholySheep

+0

@UnholySheep func2が最初に実行され、次にどの関数が次に実行されるのかわかりません。だから私はfunc2の戻り値を次の関数呼び出しのパラメータとして渡すためにいくつかの変数に格納する必要はありませんか?私はあまりにも混乱しているので、私はいくつかの基本的な概念が欠けているかもしれません。 – Forthaction

+0

このデータの存続期間、他の関数の呼び出し方法、およびこのランダムデータがコールにどのように関係するかについての情報は不十分です。これらの関数は、ランダムデータがすべてのメソッドで使用可能なインスタンス変数であるクラスに移動できます。しかし、これは、いくつかのタイプのデザインでのみ機能します。私はこれが実際にそれに答える方法がないので、広すぎるとして閉じられるだろうと思う。 – tdelaney

答えて

0

この再帰エラーでお届けします。 ^^

from random import choice 
from random import randint 


def get_fs(f): 
    return [x for x in (func1, func2, func3) if x != f] 


def func1(some_value, fs): 
    # Use some_value for whatever purpose 
    # Some code 
    f = choice(fs) 
    print("func1", f.__name__) 
    return f(randint(1,10), get_fs(func1)) 


def func2(some_value, fs): 
    # Use some_value for whatever purpose 
    # Some code 

    f = choice(fs) 
    print("func2", f.__name__) 
    return f(randint(1,10), get_fs(func2)) 


def func3(some_value, fs): 
    # Use some_value for whatever purpose 
    # Some code 

    f = choice(fs) 
    print("func3", f.__name__) 
    return f(randint(1,10), get_fs(func3)) 


def main(): 
    functions = [func2, func3] 
    func1(randint(1,10), functions) 


if __name__ == '__main__': 
    main() 
関連する問題