python的迭代器和生成器

2021-10-08 21:40:38 字數 2995 閱讀 2591

我們把可以通過for…in…這類語句迭代讀取一條資料供我們使用的物件稱之為可迭代物件(iterable)。

判斷乙個物件是否是可迭代物件,利用isinstacnce()方法

在可迭代物件中記錄每次迭代位置的是迭代器,可迭代物件通過__iter__方法提供乙個迭代器在迭代乙個可迭代物件時,實際是獲取該物件的迭代器,然後通過這個迭代器來獲取可迭代物件中的每乙個資料。

即,乙個具備了__iter__方法的物件,就是乙個可迭代的物件

list、tuple等都是可迭代物件,我們可以通過iter()函式獲取這些可迭代物件的迭代器。然後我們可以對獲取到的迭代器不斷使用next()函式來獲取下一條資料

**如下:

class

fibonacci

(object):

def__init__

(self, all_num)

: self.all_num = all_num

self.current_num =

0 self.a =

0 self.b =

1def

__iter__

(self)

:return self

def__next__

(self)

:if self.current_num < self.all_num:

ret = self.a

self.a, self.b = self.b, self.a + self.b

self.current_num +=

1return ret

else

:raise stopiteration

fibo = fibonacci(10)

for num in fibo:

print

(num)

生成器是一類特殊的迭代器。下述文字是引用:

在使用生成器實現的方式中,我們將原本在迭代器__next__方法中實現的基本邏輯放到乙個函式中來實現,但是將每次迭代返回數值的return換成了yield,此時新定義的函式便不再是函式,而是乙個生成器了。簡單來說:只要在def中有yield關鍵字的 就稱為 生成器

利用函式來實現生成器:

**如下:

def

create_num

(all_num)

:print

("-----1-----"

) a, b =0,

1 current_num =

0while current_num < all_num:

print

("-----2-----"

)yield a

print

("-----3-----"

) a, b = b, a + b

current_num +=

1print

("-----4-----"

)obj = create_num(10)

ret =

next

(obj)

print

(ret)

ret =

next

(obj)

print

(ret)

上述**的執行結果圖:

分析:因為生成器也是迭代器,所以我們用next方法來獲取每次生成的值。

第一次執行時候執行到yield後停止,然後yield 後的值作為next獲取到的值,所以輸出0;之後程式在yield處停止,直到下次呼叫next函式。

關鍵:

儲存當前執行狀態(斷點),然後暫停執行,即將生成器(函式)掛起

yield關鍵字後面表示式的值作為返回值返回,此時可以理解為起到了return的作用

生成器實現斐波那契數列:

**如下:

def

fib(n)

: current =

0 num1, num2 =0,

1while current < n:

num = num1

num1, num2 = num2, num1 + num2

current +=

1yield num

return

'done'

g = fib(5)

while

true

:try

: x =

next

(g)print

("value:%d"

%x)except stopiteration as e:

print

("生成器返回值:%s"

%e.value)

break

上述**的輸出結果:

上述**的分析:

其中,next函式取不到值的時候會引發stopiteration異常,因此捕獲異常,最後的返回值為生成器函式的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 ...

python 迭代器和生成器

迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退,不過這也沒什麼,因為人們很少在迭代途中往後退。另外,迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可...