迭代器和生成器

2022-06-19 00:00:15 字數 3231 閱讀 3729

一、迭代器

1、定義

迭代器(iterator)是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的位址。

滿足什麼樣的條件才能成為迭代器呢?

滿足什麼樣條件的物件才能提供乙個next方法呢?

class

fibonacci(object):

def__init__

(self,m):

self.m=m

def__iter__

(self):

return self #

自身是乙個迭代器

def__next__

(self):

n, a, b = 0, 0, 1

while n print

(b) a, b = b, a +b

n += 1f=fibonacci(5) #

f此時就是乙個迭代器

for i in

f:

print(i)

2、可迭代物件

可迭代物件內部僅實現了__iter()__方法,可迭代物件可以通過._ iter _()方法轉成迭代器。像listtupledictsetstr等都是直接可以使用for迴圈的物件都是可迭代物件。

list=[1,2,3]

#手動實現__iter__()方法

ilist=list.__iter__

() print(ilist.__next__())#

1print(ilist.__next__())#

2print(ilist.__next__())#

3

而在for迴圈內部也是基於這樣的實現方式,不過在for迴圈內部還進行了異常處理。

#

####for迴圈的實質#######

list=[1,2,3]

#手動實現__iter__()方法

ilist=list.__iter__

()while

true:

try:

print(ilist.__next__

())

except

stopiteration as e:

break

3、生成器

可以理解為一種資料型別,這種資料型別自動實現了迭代器協議,即內部自動實現了__iter__()和__next__()方法,所以生成器不僅是可迭代物件而且還是迭代器物件。那麼所有可迭代物件擁有的特性,它都擁有,比如for迴圈。

如何構造乙個生成器呢?

在乙個函式中通過yield關鍵字自動建立乙個生成器函式,yield會自動構建好__next__()和__iter__()方法。

def

test():

yield 1

yield 2

yield 3t=test()

print(type(t))#

print(t.__next__())#

1print(t.__next__())#

2print(t.__next__())#

3

進行for迴圈

for i in

test():

print(i) #

1,2,3

所以生成器就是迭代器的一種,是構造迭代器的工具。

def

fibanocci(m):

n,a,b = 0,0,1

while n yield

b a,b=b,a+b

n+=1f = fibanocci(5) #f為乙個迭代器物件,可以將其當作xrange來對待

while

true:

try:

print(f.__next__

())

except

stopiteration as e:

break

在類中也是可以實現迭代器的:

class

fibonacci(object):

def__init__

(self,m):

self.m=m

def__iter__

(self):

n, a, b = 0, 0, 1

while n yield

b a, b = b, a +b

n += 1f=fibonacci(5) #

f此時就是乙個迭代器

for i in

f:

print(i)

如何判斷乙個物件是可迭代物件呢?可以使用isinstance()進行判斷。

from collections import

iterable

print(isinstance(, iterable))#

true

print(isinstance({}, iterable))#

true

如何判斷是否是生成器物件?可以使用isgenerator()進行判斷

from inspect import

isgenerator

deftest():

yield 1t=test()

print(isgenerator(t))#

true

詳情檢視:

如何判斷是迭代器物件呢?可以使用isinstance()進行判斷

from collections import

iterator

a="abc

"b=iter(a)

print

(type(b))

print(isinstance(b,iterator))#

true

總結:迭代器物件內部實現了__iter__()和__next__()方法

可迭代物件僅實現__iter__()方法,必須依靠物件呼叫__iter__()方法(iter(o))才能成為迭代器物件

迭代器是可迭代物件,但可迭代物件不一定是迭代器。

生成器既是可迭代物件,又是迭代器物件,相當於xrange。

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...

生成器和迭代器

1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...