生成器,推導式

想吃橙子發表於2019-03-16

生成器

生成器的本質就是迭代器

通過函式變成一個生成器

 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__()

推導式

列表推導法 [結果 語法]  [ ] 是容器

集合推導法 [結果 語法}

字典推導法 {鍵:值 語法}

沒有元組的推導式

看著像元組的推導式 其實是一個生成器推導式 

推導器可以節省程式碼

推導式不宜太長 可讀性差

外部需要容器包一下 裡邊第一個位置是結果 剩下的是語法 每個間隔用空格隔開

 

相關文章