**
1,生成器
**
1,什麼是生成器?
genterator,記錄一個算法,可以一邊循環一邊計算的一種機制
2,清單推導式
更加耗時,更加開銷系統記憶體
3,存儲資料
實際上算法的存儲
4,節約時間,節省記憶體開銷
清單推導式的時間開銷驗證如下:
import time # 時間子產品
import sys # 系統子產品 可以計算變量在記憶體中所使用的記憶體開銷 需要用到固定的方法去計算
time.clock()
list = [x for x in range(2, 1000000, 2)]
costTime = time.clock()
print("建立清單耗時%g" % costTime)
print("建立清單記憶體開銷%d" % sys.getsizeof(list))
運作結果為:
建立清單耗時0.0590449
建立清單記憶體開銷4290016
生成器推導式的時間開銷驗證如下:
import time # 時間子產品
import sys # 系統子產品 可以計算變量在記憶體中所使用的記憶體開銷 需要用到固定的方法去計算
time.clock()
list = (x for x in range(2, 1000000, 2))
costTime = time.clock()
print("建立生成器耗時%g" % costTime)
print("建立生成器記憶體開銷%d" % sys.getsizeof(list))
運作結果為:
建立清單耗時1.2402e-05
建立清單記憶體開銷88
**
2,通路生成器元素的方式
**
生成器裡面通路元素的第一種方式:for循環周遊
list = (x for x in range(2, 10, 2))
for i in list:
print(i)
運作結果為:
2
4
6
8
通路生成器中的元素的第二種方式:使用next方法通路
list = (x for x in range(2, 10, 2))
print(next(list))
print(next(list))
print(next(list)) # 需要注意的是:超出生成器生成資料的範圍,會報錯StopIteration
通路生成器中的元素的第三種方式:使用__next__方法通路
list = (x for x in range(2, 10, 2))
print(list.__next__())
print(list.__next__())
print(list.__next__())
運作結果為:
2
4
6
通路生成器中的元素的第四種方式:使用send()方法通路
list = (x for x in range(2, 10, 2))
print(list.send(None)) #注意: 對第一個參數有要求必須給None參數,後續的參數可以随便給
print(list.send("abc"))
print(list.send("efg"))
運作結果為:
2
4
6
**
3,建立生成器的方式
**
方式1:
(x for x in range(10)) # 外面的是 () 小括号它就是一個生成器 外面是 [] 中括号它就是一個清單推導式
方式2:yield 用在函數中
def test():
for x in range(5):
yield x
f = test()
print(type(f))
print(next(f))
print(next(f))
運作結果為:
<class 'generator'>
0
1