2017-09-08 8 views
1

私はpython 3でコードを持っています。それは "ほとんど繰り返され"、私はそれを短くする簡単な方法を探しています。Python3でほぼ繰り返されるコードを短くする

私が持っているものは、N個の変数を持つ関数f(x1、...、xN)です。ユーザは変数、例えばx5を選択し、他の変数を固定したf vs x5のプロットを得る。私はいつも、手のN関数で記述することができ、それぞれが異なるXIのために次のことをやって:

def get_Array_To_Plot_x5(x1, ..., x5Start, x5End, numberOfX5, ..., xN): 
     return [f(x1, ..., xN) for x5 in numpy.linspace(xiStart, xiEnd, numberOfXi)] 

それから私は、ユーザーの入力に応じて、私のメインのスクリプトで適切なget_Array_To_Plot_xi機能(この例ではget_Array_To_Plot_x5)を呼びたい、とこの配列をプロットする。

このコードを書くには良い方法はありますか?私は、このスクリプトを私のためのテキストファイルとして書く別のコードを書くことができますが、私は可能ならばより洗練されたソリューションを望んでいます。

編集:マッド物理学者によって要求されたサンプルコードを追加:ここで

は、私が書いたコードは(私はKwantライブラリを使用してs波トポロジカル超伝導体のエネルギーレベルを計算しています)です:

def get SWaveEnergies(V0, mu, B_Zeeman, alpha, Delta, W, L, noOfLevels, a, t): 
    return some_floating_number 

def SWave_vsMu(muStart, muEnd, noOfmu, V0, B_Zeeman, alpha, Delta, W, L, noOfLevels=6, a=1, t=1.0): 
    return [SWaveEnergies(V0, mu, B_Zeeman, alpha, Delta, W, L, noOfLevels, a, t) for mu in np.linspace(muStart, muEnd, noOfmu)] 

私はこれを違った形で書いています。xiStartxiEndnoOfxiです。ユーザーのコマンドライン入力は、私が呼び出す関数を決定します。

+0

'x1 ... xN'は単一の配列として提供されるのでしょうか、別の変数として提供されていますか? –

+0

これを読んで、少なくとも引数の設定方法と関数の呼び出し方法に関して、もう少しコンテキストを提供すれば非常に役に立ちます。 –

+0

元々、ユーザーは選択したものを除き、すべてのxiに対して単一の値を与えます。選択した値に対して、配列(または配列を構築するのに十分な情報)を効果的に与えます。 –

答えて

1

forループまたはリストの理解の変数は、単純な変数名だけでなく、実際には(左辺値)に割り当てることのできる任意の式です。つまり、すべてのパラメータがリストにある場合、コードを重複させることなく、インデックスを使用してそのリストの任意の要素を反復することができます。

def get_Array_To_Plot(whichParam, start, end, number, *args): 
    args = list(args) # must be writable list, not tuple 
    values = numpy.linspace(start, end, number) 
    return [f(*args) for args[whichParam] in values] 

ループするパラメータのパラメータリストにダミー値を指定する必要があります。

+0

あなたはこの解説をテストしましたか? '[f(* args)args [whichParam] in values]'? –

+0

これはすばらしいことです:ループ変数をそのようなリスト要素のような任意の場所に隠すことができるかどうかは分かりませんでした。私に非常に便利な新しいことを教えてくれてありがとう! –

+0

ありがとうございます。これは私の問題を解決するはずです。 –

関連する問題