可以直接作用於for迴圈的數據類型有以下幾種: 一類是集合數據類型,如list、tuple、dict、set、str等; 一類是generator,包括生成器和帶yield的generator function。 可以直接作用於for迴圈的對象統稱為可迭代對象:Iterable。 可以使用isins ...
可以直接作用於for
迴圈的數據類型有以下幾種:
一類是集合數據類型,如list
、tuple
、dict
、set
、str
等;
一類是generator
,包括生成器和帶yield
的generator function。
可以直接作用於for
迴圈的對象統稱為可迭代對象:Iterable
。
可以使用isinstance()
判斷一個對象是否是Iterable
對象:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 FalseView Code
而生成器不但可以作用於for
迴圈,還可以被next()
函數不斷調用並返回下一個值,直到最後拋出StopIteration
錯誤表示無法繼續返回下一個值了。
*可以被next()
函數調用並不斷返回下一個值的對象稱為迭代器:Iterator
。
可以使用isinstance()
判斷一個對象是否是Iterator
對象:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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('abc', Iterator) 9 FalseView Code
生成器都是Iterator
對象,但list
、dict
、str
雖然是Iterable
,卻不是Iterator
。
把list
、dict
、str
等Iterable
變成Iterator
可以使用iter()
函數:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> isinstance(iter([]), Iterator) 2 True 3 >>> isinstance(iter('abc'), Iterator) 4 TrueView Code
你可能會問,為什麼list
、dict
、str
等數據類型不是Iterator
?
這是因為Python的Iterator
對象表示的是一個數據流,Iterator對象可以被next()
函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration
錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函數實現按需計算下一個數據,所以Iterator
的計算是惰性的,只有在需要返回下一個數據時它才會計算。
Iterator
甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。