1. 程式人生 > >Day11 python高級特性-- 叠代器 Iterator

Day11 python高級特性-- 叠代器 Iterator

[] bre 操作 小結 imp iter 生成器 是不是 --

直接可以作用於for循環的數據類型有以下幾種:
? 集合數據類型:
list、tuple、dict、set、str
? Generator:
生成器 和 帶 yield 的generator function.
這些可以直接作用於for循環的對象統稱為可叠代對象:Iterable。 可以通過isinstance() 判斷一個對象是否是Iterable對象:
>>> from collections import Iterable
>>> isinstance(‘abc‘, Iterable)
True
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance((), Iterable)
True
>>> isinstance((123), Iterable)
False
>>> isinstance((x*x for x in range(1,5)), Iterable)
True
>>> isinstance([ x*x for x in range(1,5)], Iterable)
True
生成器不但可以用for循環,還可以被next()函數不斷獲取下一個值,直到最後拋出StopIteration錯誤。 可以被next()函數不斷返回下一個值的對象成為叠代器Iterator。
生成器都是Iterable對象,但是Iterable對象不一定是叠代器Iterator,如 list、dict、str。
>>> l = [1,2,3,4,5,6,7]
>>> l.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘list‘ object has no attribute ‘next‘
>>> next(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ‘list‘ object is not an iterator
把list、dict、str等Iterable變成Iterator,可以使用iter()函數:
>>> from collections import Iterator
>>> isinstance(‘abc‘, Iterator)
False
>>> isinstance(iter(‘abc‘), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance(iter([]), Iterator)
True
>>> next(‘abc‘) #從這行開始,這塊實驗其實是有問題的,但是問題在哪,我目前還不知道。
Traceback (most recent call last): #在下面使用iter()函數之後,可以使用next()函數進行操作,
File "<stdin>", line 1, in <module> #但是操作多次後,結果一直為‘a‘ , 不知道為什麽。
TypeError: ‘str‘ object is not an iterator
>>> next(iter(‘abc‘))
‘a‘ 為什麽list、dict、tuple、str、set等數據類型不是Iterator呢?
Iterator對象表示的是一個數據流,可以被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出的StopIteration錯誤。這個數據流可以看作是一個有序序列,但是卻不能提前知道序列的長度,只能不斷通過next()函數來實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時才會進行計算。
Iterator甚至可以表示一個無限大的數據流,而list、tuple等對象是永遠不可能存儲無限大的數據的,例如全體自然數。
叠代器小結:
1. 可以for循環的對象都是Iterable ,可叠代對象。
2. 可以作用於next()函數的對象都是Iterator,叠代器,表示是一個惰性計算的序列。
3. 集合數據類型如dict、list、tuple等對象是Iterable,但是不是Iterator,但是可以通過iter()函數獲得Iterator對象。


for循環本質上就是不斷調用next()函數實現的,如:
for x in [1,2,3,4,5]:
pass
等同於
it = iter([1,2,3,4,5])
while True:
try:
x = next(it)
except StopIteration: #遇到StopIteration時則退出循環。
break

Day11 python高級特性-- 叠代器 Iterator