生成器內容

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] 此時纔會動生成器