迭代器
概念: 迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完
可迭代物件:一般來說可以用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...