python 生成器與迭代器

2022-05-18 15:28:52 字數 1821 閱讀 2074

生成器(generator)就是 python 中一種一邊迴圈一邊計算的機制

比如當我們生成乙個列表,我們可以通過列表式直接建立乙個列表。但是受到記憶體的限制,列表的容量肯定是有限的。而且建立乙個非常大的列表時消耗的記憶體也是非常大的。如果我們僅僅需要訪問前面幾個元素,那麼後面絕大多數占用的空間都浪費了。而生成器可以幫助我們不必建立完整的列表,在需要時通過迴圈來建立出後面的元素,節省大量的空間。

要建立生成器有很多種方法。第一種方法很簡單,只要把乙個列表的【】改成()

1 l =[x for x in range(5)] 

23 g =(x for x in range(5))

分別輸出 l 和 g 得出以下結果:

l:[0,1,2,3,4]

g:at 0x02101c90>

next(g)                               #

執行此操作會列印出 0

next(g)

#執行此操作會列印出 1

……next(g)

#執行此操作會列印出 5

在沒有元素時,,在使用 next 會丟擲乙個 stoplteration 異常。

建立生成器方法2:

1

deflister(times):

2 n =0

3while n 4yield

n5 n += 167

for x in lister(5):

8print(x)

yield 函式可以將整個函式轉換成生成器

上面的**執行時會不斷呼叫 yield ,就會不斷中斷產生乙個數值,記錄下來,此時 lister(5) 便是乙個 generator 物件。當然也可以採用 next 函式逐次輸出。

對於 yield 轉換的函式可以使用 send 來進行傳值達到控制的目的:

如 g =  lister()

g.send(6)

迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。

可被迴圈的都是可被迭代的,統稱為可迭代對像。

可以使用 isinstance() 判斷乙個物件是否是 iterable 對像:

用法: isinstance(obj,class)

如:     

1

from collections import

iterable23

isinstance ([ ], iterable)45

##返回值為 true

生成器都是 iterator 對像,但 list ,dict, str,tuple等型別雖然都是 iterable 卻不是 iterator;

生成器的值的對像被稱為迭代器

迭代器對像從集合的第乙個元素開始訪問,直到所有元素被訪問完結束。迭代器只能往前不會後退。

可以使用 isinstance() 判斷乙個物件是否是 iterable 對像:

用法: isinstance(obj,class)

如:    

1

from collections import

iterator23

isinstance ([ ], iterator)45

#返回值為false

對於非迭代器的可迭代對像可以使用 iter() 函式將 iterable 轉化為 iterator。

減少記憶體的占用

Python生成器與迭代器

生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...

python 迭代器與生成器

迭代器和生成器 print 1 in 1,2,3 print 1 not in 1,2,3 print 4 in print 4 not in 1,2,3 print x not in dlkjfxfei 可迭代物件 iterable 可以被next 函式呼叫並不斷返回下乙個值 知道沒有資料時丟擲s...

Python 迭代器與生成器

一 迭代器 理解迭代器需要搞清楚容器 container 迭代器協議 可迭代物件 iterable 迭代器 iterator 生成器 generator 1 容器 container 容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否...