2017-09-13 13 views
1

ラムダの例を理解するために、ラムダの例を理解し、 '名前'を評価することを意味するものを解読しようとしています。ラムダ式をよりよく理解する関数に変換する

私は同じ性質の複数の質問を通してふるいにかけられていますが、すべてが非常にうまく説明されていますが、これらのラムダの仕組みをまだ把握することはできません。このため、私はラムダ式をミラーリングして別々の関数を書こうとしていましたが、これが私の理解を助けるように感じます。次の例について

funcs = [lambda: i for i in range(3)] 
for f in funcs: print(f()) 

これは数 '2' を3回印刷します。どうしてこれなの?私は正確なプロセスを反映する関数を作成しようとしてきました。しかし、私は複数の方法を試してきましたが、私のリストの中に3回も数字「2」を印刷できません。

しかし、次の例では、同じような関数を作成した後にそれをもっとよく理解することができます。

funcs = [lambda i=i:i for i in range(3)] 
for f in funcs: print(f()) 

これは、それぞれ1,2,3を出力します。これが動作する方法です。

func = [] 
def i(i): 
    for i in range(i): 
      func = i 

>>> i(3) 
0 
1 
2 

上記の関数は、ラムダ式をそのまま反映するという点で正しいですか?私はベストを尽くしました。

私は上記のように、最初のラムダ式を反映させるために関数を開発しているので、式がどのように動作するのか正確には分かりません。誰も私がこのラムダの仕組みを打破するのを助けることができますか?私はしばらくの間、関数本体が実行されたときに関数本体の名前とその名前がどのように、なぜ評価されるのかを理解しようとしていました。

答えて

2

あなたの最初の例は、これに相当します。

In [ ]: 
def outer(): 
    return x 

funcs = [] 
for x in range(3): 
    funcs.append(outer) 

for f in funcs: 
    print(f()) 

Out[ ]: 
2 
2 
2 

しかし、これはちょうど同等です:

In [ ]: 
funcs = [outer] * 3 
x = 2 
for f in funcs: 
    print(f()) 

Out[ ]: 
2 
2 
2 

あなたの第二の例は同等です:

のような多くの
In [ ]: 
def outer(x): 
    def inner(): 
     return x 
    return inner 

funcs = [] 
for x in range(3): 
    funcs.append(outer(x)) 

for f in funcs: 
    print(f()) 

Out[ ]: 
0 
1 
2 

innerxのクロージャは、を機能させます。は、ラムダを現在の値iにロックさせます。一方、lambda: iはラムダを実行したときにはiの値を使用します。

+0

この回答は素晴らしいです。しかし、私はあなたが提供した最初の例にまだまだ取り組んでいます。私は、何が起こっているのかを理解するために何時間も努力してきました。ループを1回実行すると、 'funcs'に' 0'が追加されます。ループが2回目に実行されると、すでに 'funcs'に追加された' 0'を上書きし、 '1'で置き換えて別の' 1'を追加しますか? 3回目のループ(range(3))を実行すると、 '2'がリストの現在の値を上書きし、' 2'を追加します... これの背後にあるロジックは何ですか?それは私に完全に困惑している。 – juiceb0xk

+0

最初の例では、 'outer'が実行されていないので' 0'は 'funcs'に追加されません。' x'を返す関数だけが追加されます。このとき、関数 'x'が' 2'の後に関数が実行されると、各関数は '2'を返します。 – AChampion

+0

うわー、それは完璧な意味があります。私は、反復子の値をリストに追加していると思っていました... 私の問題をもっと深く理解する助けに感謝します。 – juiceb0xk

関連する問題