一、可迭代對象定義 可以直接作用於for迴圈的數據類型有以下幾種: 一類是集合數據類型,如list、tuple、dict、set、str、bytes、bytearray等; 一類是generator,包括表達式生成器和帶yield的函數生成器。 這些可以直接作用於for迴圈的對象統稱為可迭代對象:I ...
一、可迭代對象定義
可以直接作用於for
迴圈的數據類型有以下幾種:
一類是集合數據類型,如list
、tuple
、dict
、set
、str、bytes、bytearray
等;
一類是generator
,包括表達式生成器和帶yield
的函數生成器。
這些可以直接作用於for
迴圈的對象統稱為可迭代對象:Iterable
。
二、判斷一個對象是否是可迭代對象
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
三、迭代器定義
生成器不但可以作用於for
迴圈,還可以被next()
函數不斷調用並返回下一個值,直到最後拋出StopIteration
錯誤表示無法繼續返回下一個值了。
可以被next()
函數調用並不斷返回下一個值的對象稱為迭代器:Iterator
。
四、判斷一個對象是否是迭代器
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
五、迭代器總結
生成器都是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()
函數實現的。