2016-04-27 18 views
2

にパラメータ化された機能の動的なリストを作成し、私は私の問題が非常に大きいので、それらを明示的に書くの簡単なオプションが機能しませんは<a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html#scipy.optimize.fmin_slsqp" rel="nofollow noreferrer">fmin_slsqp</a>を使ってPython

ieqcons : list, optional 

A list of functions of length n such that ieqcons[j](x,*args) >= 0.0 in a successfully optimized problem. 

を提供する必要があります。

def f1(x,arg1,arg2): 
    ... 
def f2(x,arg1,arg2): 
    ... 
... 

list_func = [f1,f2,...] 

dynamic and anonymous functions in Pythonに対処し、答えのほとんどは完全に不要と思われると、関数に引数を渡すことが複雑に文字列としてコードを解析して回るこの質問があります。制約リストの性質は、単一のパラメータ(インデックスなど)が関数を一意に識別できるが、リスト内のすべての関数が同じ引数を受け取り、渡された引数に基づいて区別することが不可能であるということである。

この形式の構造は、私は関数定義でiが最終にする解決策を見つけることができませんしかしf1f2戻りi=2

に同じ関数を呼び出す

def f(x,arg1,arg2,i): 
    # return value based on i 
    # e.g. # for constrain of form x[i]>=arg1[i] the funct is: 
    #  return x[i]-arg1[i] 

i = 1 
f1 = lambda x,arg1,arg2 : f(x,arg1,arg2,i) 
i = 2 
f2 = lambda x,arg1,arg2 : f(x,arg1,arg2,i) 

十分かつ無痛だろう特定のラムダ関数への可視性を制限することができます。発言として

iは、最終的な解決策が

list_f =[] 
for i in range(0,num_cons): 
    list_f.append(lambda x,arg1,arg2 : f(x,arg1,arg2,i)) 

のようになりますので、私はこの問題解決することができますどのように変数のままに持っているか、私の目標を達成するための、より単純で巧妙な方法は何ですか?私が理解から

答えて

2

、あなたがfunctools.partialを使用してそれを解決することができます

from functools import partial 

list_f = [partial(f, i=i) for i in range(0, num_cons)] 

あなたがここにpartiallambdaに関する詳細な情報を見つけることができます。

+0

ありがとうございます...それは期待どおりに機能しました –

1

理由そのラムダ式を書くときに期待通りに機能しない場合、関数を呼び出さない。式を評価するときに呼び出されます。

評価すると、iの値は2です。したがって、同じ結果になります。私はあなたが必要なものと考えてい

はこのように、functools.partialです:

from functools import partial 

func_call_map = {i: partial(f, i=i) for i in [some range]} 

# Get result for i = 4 
ret_value = func_call_map[4](other, args, here) 
+0

ありがとうございます。それは今や行動を完全に意味し、 '部分的に'仕事をする –

1

@alecxe Python: Why is functools.partial necessary?上のリンクと回答の1のコメントで提供の説明に続いて、遅延バインディング(遅延評価)を避けるために、

i = 1 
f1 = lambda x,arg1,arg2,n_i=i : f(x,arg1,arg2,n_i) 
i = 2 
f2 = lambda x,arg1,arg2,n_i=i : f(x,arg1,arg2,n_i) 

に従いますが、functions.partialを使用すると、よりエレガントなソリューションを提供して@BurhanKhalidで説明し、コードを変更する必要があります。

関連する問題