1、可以直接作用於for循環的數據類型
第一類:集合數據類型,如list、tuple、dict、set、str等;
第二類: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
把list、dict、str等Iterable變成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類型,它們表示一個惰性計算的序列;
集合數據類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。
