0

私は純粋な関数型プログラミングを学ぼうとしています。しかし、このコードは特に私を困惑させています。値2が変数xにどのように渡されるのか分かりません。誰かがこのネストされた説明できますlambdaの動作ですか?Pythonでネストされたラムダ関数の動作を理解する

>>> square_func = lambda x: x**2 
>>> function_product = lambda F, m: lambda x: F(x)*m 
>>> square_func(2) 
4 
>>> function_product(square_func, 3)(2) 
12 

答えて

1

内側のラムダは、外側のラムダが呼び出されたときに関数を作成します。外側ラムダはこの関数を返します。この関数は、引数2で呼び出されます。

+0

あなたは値が変数にどのようにバインドされているかについていくつかの光を投げてください。 – kmario23

1

function_productので、関数と変数のために、あなたが次にsquare_funcと3を通過し、function_productの内部機能を使用すると、渡された関数(square_func)の結果を取り、あなたが渡された変数を掛け尋ねる:

このように暗黙的に定義することができます
square_func(2)*3 = 12 
1

function_product(square_func, 3)戻り、他のラムダ関数:

lambda x: square_func(x)*3 

次の他のラムダ関数を呼び出すことによって、あなたはvariabに2を渡しますle x

1

あなたの定義にtypeを適用し、それが明確であるかどうかを確認するのがよいでしょう。また、たとえあなたが言語の使用を計画していなくても、関数型プログラミングに興味があるならば、Haskellのようなものが始めるのがより良い場所になるだろうと私は助言できません。それは言って、ここであなたが得るものです:

In [13]: type(square_func) 
Out[13]: function 

In [14]: type(function_product) 
Out[14]: function 

In [15]: type(square_func(2)) 
Out[15]: int 

In [16]: type(function_product(square_func, 3)) 
Out[16]: function 

In [17]: type(function_product(square_func, 3)(2)) 
Out[17]: int 

ので不可解な部分は、関数自体であるfunction_product(square_func, 3)の戻り値の型、おそらく単一の番号を取得し、単一の数値を返すように意図されたものです。あなたがスタイルガイドに従うならば、あなたが使用している状況でlambdaを使用するために、それはルール(または条約)のようなものだ

f = function_product(square_func, 3) 
f(2) 
+0

'function_product'が' square_func'と呼ばれ、 'F'に' 3'が 'm'にバインドされ、' 2'、 'x'で呼び出される' function_product'にバインドされた関数を返します。これに代入され、 'square_func'が呼び出され、' 4'を返し、 'm'と' 4'が掛け合わされます。それで最終的に '12'を返します。私の理解/解釈は正しいのですか? – kmario23

+1

私はそれが正しいと思います。 –

1

ないを:あなたはとしてそれを書くことができます。この理由はまさにあなたが混乱してインターネットになった原因です。フラグは次のとおりです。

  1. あなたは
  2. 匿名機能に名前を与えている複数のlambdaがあります。ネストされた匿名関数を持たない言語の場合、これはコードの匂いです。 この方法を書いてメリットを享受についてのより良い方法どのよう

が存在する必要があります:それは今より読みだから

def function_product(F, m):  # returns inner, a function 
    def inner(x):    # takes x, and closes over F and m from 
     return F(x)*m   # outer scope, hence a closure 
    return inner 

を参照してください、すべてが明らかです。 lambdaを避けてください。例えば、sorted()のように、コールバックを除いて。通常の関数は、10helloのようなオブジェクトです。

いつもimport thisです。:)

関連する問題