python生成器

經過列表生成式,咱們能夠直接建立一個列表。可是,受到內存限制,列表容量確定是有限的。並且,建立一個包含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) #生成器

 建立Lg的區別僅在於最外層的[]()L是一個list,而g是一個generator。code

循環generator

能夠用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

 

 

參考文檔: 生成器---廖老師博客文檔

相關文章
相關標籤/搜索