Python 迭代器與生成器

2021-08-19 05:26:09 字數 1346 閱讀 8304

一、迭代器

理解迭代器需要搞清楚容器(container)、迭代器協議、可迭代物件(iterable)、迭代器(iterator)、生成器(generator)。

1、容器(container)

容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in, not in關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有的元素儲存在記憶體中(也有一些特例,並不是所有的元素都放在記憶體,比如迭代器和生成器物件。

在python中,常見的容器物件有:

list, deque, ….

set, frozensets, ….

dict, defaultdict, ordereddict, counter, ….

tuple, namedtuple, …

str

2、迭代器協議

在提供了next方法的物件中,執行迭代時返回下一項,當迭代至最後一項時就引起乙個stopiteration異常,此時終止迭代。通常在物件內部定義乙個__iter__()方法和__next__() 方法實現了迭代器協議 

3、可迭代物件(iterable)

實現了迭代器協議的物件被稱為可迭代物件。很多容器都是可迭代物件,此外如處於開啟狀態的files,sockets等更多的物件同樣也是可迭代物件。

4、迭代器(iterator)

迭代器是乙個帶狀態的物件,它不會一次性把所有元素載入到記憶體,而是需要的時候才生成返回結果。呼叫__iter__()方法返回迭代器自身,呼叫next()方法的時候返回當前呼叫生成的結果,同時為下一次呼叫next()方法修改狀態。

二、生成器

生成器是一種特殊的迭代器,不過這種迭代器更加優雅。它不需要再像上面的類一樣寫__iter__()和__next__()方法了,只需要乙個yiled關鍵字。生成器不是立即產生結果,而是在需要的時候才產生結果,這種延遲操作是生成器的主要的用途。生成器函式與生成器表示式是生成器兩種常見的用途。

1、生成器函式

生成器函式和常規函式的定義相同,不同之處在於它的返回值不是通過return而是用yield。當執行到yield語句時會自動掛起該生成器函式的狀態,保留足夠的資訊,以便之後從它離開的地方繼續執行。

2、生成器表示式

類似於列表推導式,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表。

squares = (x**2 for x in range(5))
python的很多內建函式(如for迴圈,sum函式)會自動實現迭代器協議,因此可以寫出更加pythonic的**。

sum(x ** 2 for x in xrange(4))

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 迭代器與生成器

迭代就像是遍歷,迭代只能乙個個往下獲取,不能往上獲取,需使用iter函式。name是乙個包含元素cc,dd,ee的迭代器 name iter cc dd ee 訪問迭代器中的元素需使用next方法 print name.next cc print name.next dd print name.ne...