一、迭代器
1、定義
迭代器(iterator)是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的位址。
滿足什麼樣的條件才能成為迭代器呢?
滿足什麼樣條件的物件才能提供乙個next方法呢?
classfibonacci(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 _()方法轉成迭代器。像list
、tuple
、dict
、set
、str等都是直接可以使用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__()方法。
deftest():
yield 1
yield 2
yield 3t=test()
print(type(t))#
print(t.__next__())#
1print(t.__next__())#
2print(t.__next__())#
3
進行for迴圈
for i intest():
print(i) #
1,2,3
所以生成器就是迭代器的一種,是構造迭代器的工具。
deffibanocci(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
在類中也是可以實現迭代器的:
classfibonacci(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 importiterable
print(isinstance(, iterable))#
true
print(isinstance({}, iterable))#
true
如何判斷是否是生成器物件?可以使用isgenerator()進行判斷
from inspect importisgenerator
deftest():
yield 1t=test()
print(isgenerator(t))#
true
詳情檢視:
如何判斷是迭代器物件呢?可以使用isinstance()進行判斷
from collections importiterator
a="abc
"b=iter(a)
(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...