經過列表生成式,咱們能夠直接建立一個列表。可是,受到內存限制,列表容量確定是有限的。並且,建立一個包含100萬個元素的列表,不只佔用很大的存儲空間,若是咱們僅僅須要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。python
因此,若是列表元素能夠按照某種算法推算出來,那咱們是否能夠在循環的過程當中不斷推算出後續的元素呢?這樣就沒必要建立完整的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。code
能夠用for對generator遍歷。blog
for j in G: print(j) 0 2 4 6 8 10 12 14 16 18
對於列表,咱們能夠在長度內任意取值,而生成器只有在循環到這一次了纔有值。ip
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
參考文檔: 生成器---廖老師博客文檔