python中的迭代器


1、可以直接作用於for循環的數據類型

  第一類:集合數據類型,如listtupledictsetstr等;

  第二類:generator,包括集合定義generator和帶yield的generator(也就是generator function)。

   以上這些可以直接作用於for循環的對象統稱為可迭代對象:Iterable

可以使用isinstance()判斷一個對象是否是Iterable對象:

 1 >>> from collections import Iterable
 2 >>> isinstance([], Iterable)
 3 True
 4 >>> isinstance({}, Iterable)
 5 True
 6 >>> isinstance('abc', Iterable)
 7 True
 8 >>> isinstance((x for x in range(10)), Iterable)
 9 True
10 >>> isinstance(100, Iterable)
11 False

2、迭代器(Iterator)

generator不但可以作用於for循環,還可以被next()函數不斷調用並返回下一個值,直到最后拋出StopIteration錯誤表示無法繼續返回下一個值了。那么定義來了,可以被next()調用並不斷返回下一個值得對象稱為迭代器(Iterator)。

很明顯,generator可以被next()調用,並不斷返回下一個值,所以generator肯定是Iterator。那么除了generator,還有那些是Iterator呢?如何判斷一個對象是否是Iterator呢?

以使用isinstance()判斷一個對象是否是Iterator對象:

1 >>> from collections import Iterator
2 >>> isinstance((x for x in range(10)), Iterator)  #注意,(x for x in range(10))這是一個generator,因為由列表生成式[]改成了()。
3 True
4 >>> isinstance([], Iterator)
5 False
6 >>> isinstance({}, Iterator)
7 False
8 >>> isinstance('abc', Iterator)
9 False

 從以上可以看出,list,dict,str雖然是Iterable,但不是Iterator。  而generator都是Iterator。

3、將Iterable變成Iterator

listdictstrIterable變成Iterator可以使用iter()函數:

1 >>> isinstance(iter([]), Iterator)
2 True
3 >>> isinstance(iter('abc'), Iterator)
4 True

 例如:

 1 g = iter('abc')
 2 
 3 >>> next(g)
 4 'a'
 5 >>> next(g)
 6 'b'
 7 >>> next(g)
 8 'c'
 9 >>> next(g)
10 Traceback (most recent call last):
11   File "<pyshell#202>", line 1, in <module>
12     next(g)
13 StopIteration

 4、小結

凡是可作用於for循環的對象都是Iterable類型;

凡是可作用於next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列;

集合數據類型如listdictstr等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM