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
對象。