2017-09-14 12 views
4

遅延評価はいつですか? (ジェネレータ、if、iterator?)、 レイトバインディングはいつですか? (閉鎖、正規の機能?)遅延評価とPythonの遅延バインド?

a = [1,2,3,4] 
    b = [lambda y: x for x in a] 
    c = (lambda y: x for x in a) #lazy evaluation 
    d = map(lambda m: lambda y:m, a) #closure 
    for i in b: 
     print i(None) 
    # 4 4 4 4 
    for i in c: 
     print i(None) 
    # 1 2 3 4 
    for i in d: 
     print i(None) 
    # 1 2 3 4 
+1

さて、あなたはのpython3を使用している情報を評価され、マップがdとcは同じである理由であるイテレータを返します –

+0

私はpython2.7を使用しています、dは QuantumEnergy

答えて

1

これは宿題のように見えるので、私はあなたに答えを与えるだけではありません。ここでは、どのように値を変更するかをステップバイステップで確認できる2つの関数があります。

def make_constants_like_generator(): 
    def make_constant(x): 
     def inner(y): 
      return x 
     return inner 
    results = [] 
    for i in [1, 2, 3, 4]: 
     results.append(make_constant(i)) 
     for f in results: 
      print f(None) 
    return results 

def make_constants_like_list(): 
    x = None 
    results = [] 
    for i in [1, 2, 3, 4]: 
     x = i 
     def inner(y) 
      return x 
     results.append(inner) 
     for f in results: 
      print f(None) 
    return results 

遅延評価は、式を評価する最後の瞬間まで待機しています。反対に熱心な評価です。ジェネレータの表現は怠惰です。反復されるまで何もしません。リスト式は熱心で、直面するとすぐにリストに値が入力されます。

早期バインドと遅延バインディングは、システムが名前の参照先を決定する方法に関連しています。 Pythonのすべての名前は遅延バインドされています。どのような名前がバインドされていることは、それを使用する式の前に変更することができることを意味し、遅延評価と合わせて

def map(func, iter): 
    return (func(val) for val in iter) 
+0

です。遅延評価、遅延バインディングについてもっと知りたいです。地図の結果は私に混乱しています – QuantumEnergy

+0

これはどういう意味ですか? (make_constants_like_list) DEF make_constants_like_list(): DEF内側(Y):[1、2、3、4]におけるiに対する 結果= [] リターンI results.append(内側) リターン – QuantumEnergy

+0

結果なし私は具体的にはこれらが長すぎることを意味するので、ステップインしたり、プリントを追加したりすることができます。 – Caleth