python生成器
阿新 • • 發佈:2017-08-01
很大的 iptable lis 一次 生成器 type () 而且 get
通過列表生成式,我們可以直接創建一個列表。但是,受到內存限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。
所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator。
創建一個生成器
l = [ i*2 for i in range(10)] print(l) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 列表生成式 G = (i*2 for i in range(10)) print(G) #生成器
創建L
和g
的區別僅在於最外層的[]
和()
,L
是一個list,而g
是一個generator。
循環generator
可以用for對generator遍歷。
for j in G: print(j) 0 2 4 6 8 10 12 14 16 18
對於列表,我們可以在長度內任意取值,而生成器只有在循環到這一次了才有值。
l = [ i*2 for i in range(10)] G = (i*2 for i in range(10)) print(l[4]) #8 print(G[4]) #TypeError: ‘generator‘ object is not subscriptable
generator中有一個next()方法可以直接使用。第一次使用返回第一個值,第二次使用返回第二個值,以此類推。這個是獲取下一個值,generator中沒有獲取上一個值的方法。
G = (i*2 for i in range(10)) print(G.__next__()) #0 print(G.__next__()) #2 print(next(G)) #4 print(next(G)) #6
參考文檔: 生成器---廖老師博客
python生成器