1. 程式人生 > >python生成器

python生成器

很大的 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) #生成器

創建Lg的區別僅在於最外層的[]()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生成器