1、可迭代對象定義函數
能夠直接做用於for
循環的數據類型有如下幾種:spa
一類是集合數據類型,如list
、tuple
、dict
、set
、str、bytes、bytearray
等;code
一類是generator
,包括表達式生成器和帶yield
的函數生成器。對象
這些能夠直接做用於for
循環的對象統稱爲可迭代對象:Iterable
。blog
2、判斷一個對象是不是可迭代對象generator
1 >>> from collections import Iterable 2 >>> isinstance([], Iterable) 3 True 4 >>> isinstance({}, Iterable) 5 True 6 >>> isinstance(b'abc', Iterable) 7 True 8 >>> isinstance((x for x in range(10)), Iterable) 9 True 10 >>> isinstance(100, Iterable) 11 False
3、迭代器定義it
生成器不但能夠做用於for
循環,還能夠被next()
函數不斷調用並返回下一個值,直到最後拋出StopIteration
錯誤表示沒法繼續返回下一個值了。io
能夠被next()
函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator
。class
4、判斷一個對象是不是迭代器import
1 >>> from collections import Iterator 2 >>> isinstance((x for x in range(10)), Iterator) 3 True 4 >>> isinstance([], Iterator) 5 False 6 >>> isinstance({}, Iterator) 7 False 8 >>> isinstance(b'abc', Iterator) 9 False
5、迭代器總結
生成器都是Iterator
對象,但list
、tuple
、dict
、set
、str、bytes、bytearray
等雖然是Iterable
,卻不是Iterator
。
把list
、tuple
、dict
、set
、str、bytes、bytearray
等Iterable
變成Iterator
可使用iter()
函數。iter()
函數能夠把一個可迭代對象轉換成一個迭代器。
1 >>> from collections import Iterator 2 >>> isinstance(iter([]), Iterator) 3 True 4 >>> isinstance(iter(b'abc'), Iterator) 5 True
爲何list
、dict
、str
等數據類型不是Iterator
?
這是由於Python的Iterator
對象表示的是一個數據流,Iterator對象能夠被next()
函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration
錯誤。能夠把這個數據流看作是一個有序序列,但咱們卻不能提早知道序列的長度,只能不斷經過next()
函數實現按需計算下一個數據,因此Iterator
的計算是惰性的,只有在須要返回下一個數據時它纔會計算。
Iterator
甚至能夠表示一個無限大的數據流,例如全體天然數。而使用list是永遠不可能存儲全體天然數的。
凡是可做用於for
循環的對象都是Iterable
類型;
凡是可做用於next()
函數的對象都是Iterator
類型,它們表示一個惰性計算的序列;
集合數據類型如list
、dict
、str
等是Iterable
但不是Iterator
,不過能夠經過iter()
函數得到一個Iterator
對象;
Python的for
循環本質上就是經過不斷調用next()
函數實現的。