2017-02-21 7 views
3

ラムダ関数について簡単な質問があります。私は、すべての反復が前の反復からのラムダ関数に基づいて新しいラムダ関数を定義するループを実行したい。Pythonで関数を再帰的に定義する

f = lambda x: x**2 
j=0 
J=2 
while j<J: 
    f2 = lambda x: 0.5*f(x) 
    f = f2 
    j+=1 

Iは、Fの結果は、(3)2.25 = 0.5 * 0.5 * 3 ** 2であることを期待します。しかし、私は次のエラーが表示されます:

このようにラムダ関数を柔軟に使用できると思いました。私はこれを適切に行う方法の有名な方法があると思いますか?したがって、無限再帰、それはラムダ自体を指し、その時点で - あなたのラムダ内部

答えて

3

fをラムダが呼ばれた時点でを見上げています。

特定の時点における値を取得するための一般的なイディオムが定義時に評価されますラムダ、デフォルトのパラメータにすることです:lambda関数が作成されると

f2 = lambda x, f=f: 0.5*f(x) 
+0

'lambda'ではなく' def'を使ってこれを行う方法もありますか? – splinter

+0

もちろん、デフォルトのパラメータを使用した同じトリックも、通常の関数と同様に機能します。ラムダは実際に新しい機能をPythonに追加しないことを覚えておいてください。本当に単純な関数を定義するための簡単な方法です。 – jasonharper

3

、それは呼び出されたときにlambda内の変数を参照できるように、ローカル環境への参照を保持します。あなたは二番目のパラメータとして、あなたの最初のlambda機能に渡す必要があります。

f = lambda x: x**2 
j=0 
J=2 
while j<J: 
    f2 = lambda x, f=f: 0.5*f(x) 
    f = f2 
    j+=1 

これはPython docs FAQで覆われていることに注意してください。

+0

答えはまったく同じなので、私は最初のものを受け入れました。ありがとうございます – splinter

+0

心配する必要はありません。両方を受け入れることはできません: –

+0

'lambda'ではなく' def'を使ってこれを行う方法もありますか? – splinter