1,生成器 生成器的本質就是迭代器 生成器的特色和迭代器同樣,取值方式和迭代器同樣(__next__(),send():給上一個yield傳值) 生成器通常有生成器函數或者生成器表達式來建立 其實就是手寫的迭代器 2,生成器函數 和普通函數沒有區別,裏面有yield的函數就是就是生成器函數 生成器函數在執行的時候,默認不會執行函數體,返回生成器 經過生成器的__next__()分段執行這個函數 send()給上一個yield傳值,不能在開頭的位置(沒有上一個yield),最後一個yield也不能夠用send() 3,推導式 1,列表推導式 [結果, for循環, 條件篩選] 2,字典推導式 {k:v, for循環, 條件篩選} 3,集合推導式 { k ,for循環,條件篩選] 4,生成器表達式 (結果 for循環 條件) 特色: 1,惰性機制 2,只能向前 3,節省內存
1,
def func(): print(111) yield 222 yield 333 g = func() #獲取生成器 g1 = (i for i in g) #生成器 g2 = (i for i in g1) #生成器 print(list(g2)) # 111 \n [222,333] 源頭,從源頭把數據拿走了 print(list(g1)) # [] 這裏執行的時候,源頭已經沒有數據
2,很坑的面試題 def add(a,b): #求和 return a+b def test(): #生成器函數 0,1,2,3 for i in range(4): yield i g = test() #獲取生成器 for n in [2,10]: #到最後才放數據(惰性) g = (add(10,i)for i in g)
#此時的g是一個生成器,實際上內部並無被執行
至關於如下代碼:
n = 10
g = (add(n, i) for i in g)
g = (add(n, i) for i in g)
print(list(g)) # [20, 21, 22, 23] 此時纔會動生成器