Python迭代器和生成器簡介

2021-08-21 13:05:11 字數 1977 閱讀 4066

1. 迭代器協議

1)迭代器協議是指:物件需要提供next方法,它要麼返回迭代中的下一項,要麼就引起乙個stopiteration異常,以終止迭代;

2)可迭代物件就是:實現了迭代器協議的物件;

3)協議是一種約定,可迭代物件實現迭代器協議,python的內建工具(如for迴圈,sum,min,max函式等)使用迭代器協議訪問物件。

舉個例子:在所有語言中,我們都可以使用for迴圈來遍歷陣列,python的list底層實現是乙個陣列,所以我們可以使用for迴圈來遍歷list。此外python的for迴圈不但可以用來遍歷list,還可以用來遍歷檔案物件。

為什麼在python中,檔案還可以使用for迴圈進行遍歷呢?這是因為,在python中,檔案物件實現了迭代器協議,for迴圈並不知道它遍歷的是乙個檔案物件,它只管使用迭代器協議訪問物件即可。

2. 生成器

python使用生成器對延遲操作提供了支援。所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果。這也是生成器的主要好處。

python有兩種不同的方式提供生成器:

1)生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行

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

2.1 生成器函式

舉例:1)使用生成器返回自然數的平方

def gensquares(n):

for i in range(n):

yield i ** 2

for item in gensquares(5):

print(item)

for item in gensquares(5):

print(item)

2.2 生成器表示式

使用列表推導,將會一次產生所有結果:

>>>squares = [x**2 for x in range(5)]

>>>squares

[0, 1, 4, 9, 16]

將列表推導的中括號,替換成圓括號,就是乙個生成器表示式:

>>> squares = (x**2 for x in range(5))

>>> squares

at 0x0000019f5114b1a8>

>>> next(squares)

0>>> next(squares)

1>>> next(squares)

4>>> list(squares)

[9, 16]

2.3 再看生成器

1)語法上和函式類似:生成器函式和常規函式幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值;

2)自動實現迭代器協議:對於生成器,python會自動實現迭代器協議,以便應用到迭代背景中(如for迴圈,sum函式)。由於生成器自動實現了迭代器協議,所以,我們可以呼叫它的next方法,並且,在沒有值可以返回的時候,生成器自動產生stopiteration異常

3)狀態掛起:生成器使用yield語句返回乙個值。yield語句掛起該生成器函式的狀態,保留足夠的資訊,以便之後從它離開的地方繼續執行

3. 示例

首先,生成器的好處是延遲計算,一次返回乙個結果。也就是說,它不會一次生成所有的結果,這對於大資料量處理,將會非常有用。

除了延遲計算,生成器還能有效提高**可讀性。例如,現在有乙個需求,求一段文字中,每個單詞出現的位置。

使用生成器的情況:

def index_words(text):

if text:

yield 0

for index, letter in enumerate(text, 1):

if letter == ' ':

yield index

4. 使用生成器的注意事項

生成器的唯一注意事項就是:生成器只能遍歷一次。

迭代器和生成器簡介

i i for i in range 8 生成器表示式 def fib n i 0a,b 1,1 while i n yield a a,b b,a b i 1 f fib 6 for item in f print item list fib 6 在生成器中,如果沒有return,則預設執行到函式...

Python迭代器和生成器

先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...

Python迭代器和生成器

迭代器是訪問集合元素的一種方法 是可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問 他有兩個基本的方法,iter 和next 字串,列表或遠足物件都可以用於建立迭代器 list1 1,2,3,4 it1 iter list1 建立迭代器物件 print next ...