Python叠代器和生成器
阿新 • • 發佈:2018-02-06
__next__ 叠代器協議 iterator 關系 pytho 不能 span str strong
一、叠代器
現在已知的可叠代對象:str list tuple dict set range和文件句柄。
但是,什麽是可叠代對象?可叠代對象的測量方法。
方法一: dir(被測對象) 如果 他含有__iter__ ,那這個對象就叫做可叠代對象.
下面字符串S就是可叠代對象:
s= ‘abcdef‘
print(‘__iter__‘ in dir(s))
可叠代對象,iterable 與叠代器有什麽關系?可叠代對象可以轉換成叠代器(可叠代對象.__iter__())。
s1 = s.__iter__()
print(s1) #iterator 遵循叠代器協議
叠代器的取值:(叠代器.__next__())
#叠代器取值:
s2 = ‘abcd‘
s3 = s2.__iter__()
print(s3.__next__()) #a
print(s3.__next__()) #b
只含有__iter__方法的數據是可叠代對象,含有__iter__方法,並且含有__next__方法的數據是叠代器
#叠代器的判斷:有__iter__方法,並且含有__next__方法的數據是叠代器 l = [1,2,3,4] print(‘__iter__‘ in dir(l)) #True print(‘__next__‘ in dir(l)) #False liter = l.__iter__() print(‘__next__‘ in dir(liter)) #True print(liter.__next__()) #1 print(liter.__next__()) #2 print(liter.__next__()) #3 print(liter.__next__()) #4
方法二:測量他是可叠代的還是叠代器:
# 方法二 測試他是叠代器還是可叠代對象 l = [1,2,3] l_iter = l.__iter__() from collections import Iterable from collections import Iterator print(isinstance(l,Iterable)) #True print(isinstance(l,Iterator)) #False print(isinstance(l_iter,Iterator)) #True print(isinstance(l,list)) #Truedied
叠代器的意義:
1)、叠代器節省內存.
2)、叠代器惰性機制.
3)、叠代器不能反復,一直向下執行.
for 循環的內部機制:
1)、內部含有__iter__方法,他會將可叠代對象先轉化成叠代器.
2)、然後在調用__next__方法.
3)、for循環有異常處理的方法.
#用叠代器來表示for循環的內部機制
for i in [1,2,3]:
print(i)
l = [1,2,3]
l_iter = l.__iter__()
while True:
try:
print(l_iter.__next__())
except StopIteration:
break
二、生成器
Python叠代器和生成器