生成器
生成器的本質就是迭代器
通過函式變成一個生成器
1 def func(): 2 print(1) 3 yield 5 # 我的函式走到這了 4 print(2) 5 yield 9 # 我的函式走到這了 6 7 g = func() # 生成一個生成器 8 9 print(g.__next__()) 10 print(g.__next__()) 11 print(list(range(10000)))
每次遇到yield會返回並標記
下次從yield下面的函式開始執行
一共只有一個生成器
1 f func(): 2 print(1) 3 # return 5 4 yield 5 5 print(func().__next__()) # 這樣生成一個生成器 6 print(func().__next__()) # 這樣生成一個生成器 7 print(func().__next__()) # 這樣生成一個生成器 8 print(func().__next__()) # 這樣生成一個生成器 9 print(func().__next__()) # 這樣生成一個生成器
遇到yield就返回 再次列印還是從頭開始 每次列印都生成一個新的生成器
函式遇到return就結束 遇到yield不結束就掛起
yield作用 掛起 返回值 接受值
生成器一定是一個迭代器 迭代器不一定是生成器
生成器是可以讓程式設計師自己定義的一個迭代器
生成器的好處 可以節省空間
生成器的特性 一次性的 惰性機制 從上到下
send 相當於 next + 傳的值 第一次接觸生成器時,如果要用send send的值必須是None 一般建議使用__next__
yield from 將可迭代物件元素挨個返回
python2 3x 版本操作區別
python2 iter() next()
python3 iter() next() __next__() __iter__()
推導式
列表推導法 [結果 語法] [ ] 是容器
集合推導法 [結果 語法}
字典推導法 {鍵:值 語法}
沒有元組的推導式
看著像元組的推導式 其實是一個生成器推導式
推導器可以節省程式碼
推導式不宜太長 可讀性差
外部需要容器包一下 裡邊第一個位置是結果 剩下的是語法 每個間隔用空格隔開