迭代器和生成器

2021-10-05 15:58:42 字數 3581 閱讀 2153

迭代器

概念: 迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完

可迭代物件:一般來說可以用for進行遍歷的就是可迭代物件,例如:list,tuple等型別都是迭代器

例項:1、建立乙個類,該類包含__iter __魔法方法就是可迭代物件

2、乙個類中含有__iter__和__next__兩個魔法方法就是迭代器

測試1:

##迭代器測試

from collections.abc import iterable

from collections.abc import iterator

class

classmate

(object):

def__iter__

(self)

:pass

classmate = classmate(

)print

('是否為可迭代物件'

,isinstance

(classmate,iterable)

)

結果:

是否為可迭代物件 true

測試2:

##迭代器測試

from collections.abc import iterable

from collections.abc import iterator

class

classmate

(object):

def__iter__

(self)

:pass

def__next__

(self)

:pass

classmate = classmate(

)print

('是否為可迭代器'

,isinstance

(classmate,iterator)

)

那麼上面建立的迭代器如何使用呢:

測試

##迭代器測試

from collections.abc import iterable

from collections.abc import iterator

class

classmate

(object):

def__init__

(self)

: self.numbers =[1

,2,3

,4] self.current_count =

0def

__iter__

(self)

:return self#可迭代物件__iter__的返回值要求是乙個例項化物件,並且該物件有__iter__和__next__方法,所以剛好選擇自身

def__next__

(self)

:if self.current_count <

len(self.numbers)

:#判斷是否為自生的最後乙個元素

ret = self.numbers[self.current_count]

self.current_count +=

1return ret

else

:raise stopiteration #結束迭代器

classmate = classmate(

)for each_num in classmate:

print

(each_num)

特點:如果乙個物件是迭代器,那麼一定是可迭代物件

迭代器的優點

占用極小的記憶體,實現功能

舉例說明占用記憶體小:

##常規方法列印斐波那契數列

def

fib(countall)

: a,b =0,

1 count =

0 k =

#存放所有的資料

while

true

:if count < countall:

count +=

1 a, b = b, a+b

else

:break

return k

f = fib(3)

print

(f)

##用迭代器實現斐波納契

class

fibonacci

(object):

def__init__

(self, all_num)

: self.all_num =

10 self.a =

0 self.b =

1 self.current_num =

0def

__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

fib = fibonacci(10)

#生成十個

for num in fib:

print

(num)

生成器:帶有yield 的函式就是生成器,生成器是一種特殊的迭代器

作用:可以實現多工同時進行

使用

import time

deftest1()

:while

true

:print

('===working__test1===='

) time.sleep(

0.4)

yield

deftest2()

:while

true

:print

('===working__test2===='

) time.sleep(

0.4)

yield

defmain()

: t1 = test1(

)#生成乙個生成器

t2 = test2(

)#生成乙個生成器

while

true

:next

(t1)

#執行一次函式

next

(t2)

if __name__ ==

'__main__'

: main(

)

生成器的特點:

1、yield 類似與return ,但是不會重新執行函式,只會在上一次終止的地方開始執行

2、不僅僅是next()啟動生成器,通過send來啟動生成器,生成器.send(none)類似於next(obj),但是可以傳引數,傳過去的引數可以作為 yield的返回值

生成器和迭代器

可以直接作用於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...