2017-09-14 110 views
4

什麼時候是懶惰評價? (發生器,如果,迭代器?), 何時是晚期綁定? (關閉,正常功能?)懶惰的評價和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

這看起來像家庭作業,所以我不會給你答案。這裏有兩個功能,您可以逐步查看值的更改方式。

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(): 結果= [] 對於i在[1,2,3,4]: DEF內(Y): 返回我 results.append(內) 返回結果 – QuantumEnergy

+0

否,我特意指這些是冗長的,所以他們可以通過和/或已添加打印 – Caleth