2016-08-05 10 views
3

私はPythonスクリプトの初心者です。 以下の例のように、lambdaが渡される変数をどのように解釈するのか混乱します。Pythonのラムダと余分な無限の変数

def create_multipliers(): 
    return [lambda x : i * x for i in range(5)] 

for multiplier in create_multipliers(): 
    print multiplier(2), 

戻っ8 8 8 8 8

私は、ラムダが一つだけの引数(すなわち 'X')を受け入れることを参照してください。

create_multipliersでxとiをどのように解釈しますか? また、乗数(2)はどういう意味ですか?

どのようにラムダ/ make_incrementor機能は 'X' と 'N' をあるかを決めるん55

を返さ

def make_incrementor (n): return lambda x: x + n 
print make_incrementor(22)(33) 

以下の例でも

を助けてください?

+0

[niemmi(http://stackoverflow.com/users/5043793/niemmi)はすばらしい答えを書いていますが、私はあなたにもこのサイトの[なぜ 'lambda's cool '(http://stackoverflow.com/q/890128/5018771)すでに。 – BusyAnt

答えて

2

コードの最初の部分は、それぞれ単一の引数xをとり、iと乗算するlambdaのリストを作成します。各ラムダは、から変数iまでは '現在の値ではありません。リスト内包後iの値が4あるので、各ラムダはx * 4が返される。

>>> def create_multipliers(): 
...  return [lambda x: i * x for i in range(5)] 
... 
>>> l = create_multipliers() 
>>> l[0](1) 
4 
>>> l[4](1) 
4 
>>> l[4]('foobar') 
'foobarfoobarfoobarfoobar' 

ループは、パラメータ2各ラムダを実行し、同じ行に結果を表示します。 5つのラムダがあり、4 * 2が8なので、あなたが見る出力が得られます。

>>> for multiplier in l: 
...  print multiplier(2), 
... 
8 8 8 8 8 

同じ原理で動作しますmake_incrementorprint文の後,は、出力が同じ行に印刷されるようになります。 lambdaが呼び出されたときに "決定"された単一の引数xを受け取るラムダを返します。

>>> def make_incrementor(n): 
...  return lambda x: x + n 
... 
>>> inc = make_incrementor(2) # n is "decided" here 
>>> inc(3)     # and x here 
5 

UPDATEネストされた関数と例:nmake_incrementorに渡された値であり、それは次にx + nが返され

>>> def make_incrementor(n): 
...  def nested(x): 
...   return x + n 
...  return nested 
... 
>>> inc = make_incrementor(2) 
>>> inc(3) 
5 
+0

ラムダはどのように引数として 'x'を取るのですか?それはどうですか?(make_incrementorの例で) ラムダの機能ですか? これは通常のネストされた関数で行うことができますか? – anudeep

+0

@deeps: 'x'は引数の名前だけです。他の関数と同様に、' y'や 'foobar'に名前を付けることもできます。もちろん、その値は呼び出されるまでに決定されます。上記の例をネストされた関数と同じように簡単に実装することができます。 – niemmi

+0

:私はそれを 'x'と言いました。 ラムダがmake_incrementor(2)(3)の3を「x」としてどうやって来るのか、私の質問は(バカかもしれませんが、誰かがそれを指示しますか? また、目的の機能を実装するためにネストされた関数を試しましたが、できません。 – anudeep

関連する問題