1. 程式人生 > >Python叠代器和生成器

Python叠代器和生成器

__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叠代器和生成器