2016-09-21 6 views
0

私はMatlabからPythonに切り替えました。ラムダ関数を使用して、f1(x,y)関数を多重引数を1つの引数関数f2(x)にマップします。 私は機能をマッピングする際f2(x) <- f1(x,y=y1)そしてyが、これはデフォルトでtrueであるMATLABでは、どんなy1変化を一定に保たないことをしたいが、私はPythonでしようとした場合、それは次の例のように変更他の関数のラムダ関数ですが、固定引数を強制します

>>> def f1(x,y): 
>>> return (x+y) 
>>> y1 = 2 
>>> f2 = lambda x: f1(x,y1) 
>>> f2(1) 
3 

Iを保持します期待して私はy1を変更した場合、私は疑問に思う

>>> y1 = 5 
>>> f2(1) 
6 

を次のようにしかし、全体f1(1)もWH方法がある変更、y1を変更した場合でもf2(1)滞在3 en f2 = lambda x: f1(x,y1)を宣言してからf1の値をy1とし、f2に修正します。なぜなら、異なるシナリオに対して異なる機能を動的に作成し、それらを合計したいからです。 私はまだPythonには新しく、助けてください、多くの感謝しています。

答えて

2

試してみてください。

f2 = lambda x, y=y1: f1(x,y) 

あなたの問題はy1の現在のバージョンを使用しますラムダ関数のhow closures work in Python

あなたのバージョンに関係しています。 キャプチャラムダ関数を定義した行のy1の値を取得する必要があります。これを行うには、パラメータのデフォルト値(y=y1部分)として定義できます。

+0

を明示的DEF声明 を超える提供できる唯一の 利益を排除し、私が望むようには動作するようになりました、先端に感謝実際にはまだ2つの引数がありますが、1つの引数が必要になりますので、私のケースでは動作します。 –

1

既に指摘したように、問題はクロージャの仕組みによって決まります。しかし、実際にはこれにラムダを使用すべきではありません。ラムダは無名関数用です。代わりにdef文と高階関数を作成します。PEP8から

>>> y = 3 
>>> newfunc = f1_factory(y) 
>>> newfunc(1) 
4 
>>> y = 20 
>>> newfunc(1) 
4 
>>> 

は必ずするのではなく、DEF文を使用

>>> def f1(x,y): 
... return x + y 
... 
>>> def f1_factory(y): 
... def f1_y(x): 
...  return f1(x,y) 
... return f1_y 
... 
>>> f1_factory(6)(4) 
10 
>>> f1_factory(5)(4) 
9 

また、あなたが遭遇した問題を回避します がラムダ式を識別子に直接バインドする代入文。

はい:

デフF(X):リターン2 * X

番号:

F =ラムダX 2 * X

最初フォームつまり名前の結果の 関数オブジェクトは、汎用<lambda>ではなく、具体的には「f」です。 これは一般的な のトレースバックと文字列表現に役立ちます。代入文の使用は、ラムダ式は(すなわち、それは、より大きな式の中に埋め込むことができることを)

+0

私はMatlabで@関数を使用していますが、Pythonのlambda関数はまったく同じものだと思っていました。私は将来のコーディングのためにこれを念頭に置いておきます、アドバイスのために多くのお礼ありがとうございます。 –

+0

@JoseVuもっとスタイルの問題です。どちらも匿名関数です。しかし、Pythonのスタイルは、あなたの無名関数が匿名関数にならない場合は、完全な関数定義文を使用するだけです。 –

関連する問題