迭代器 Iterator
先介紹一個概念:Iterable(可迭代對象)
。可以直接作用於for
循環的對象。
像集合數據類型(list,tuple,dict,set,str
等) 和generator
(包括生成器和帶yield
的generator function)都是可迭代對象。
那麼,什麼是 Iterator
呢?它和 Iterable
又有什麼區別?
Iterator(迭代器) 是可以被next()
函數調用並不斷返回下一個值的對象。
它表示的是一個數據流。我們可以將它看成一個有序序列,但是不能提前知道序列的長度(因爲要被next()調用實現計算下一個數據,直到沒有數據時拋出StopIteration
錯誤。)這裏也可以看出,Iterator的計算是惰性的,因爲只有在需要返回下一個數據時,它纔會計算。
Iterator 可以表示一個無限大的數據流,比如全體自然數。這是list做不到滴。
下面就來看看如何使用迭代器。
之前已經學習了判斷可迭代對象的方法,再回顧一下:
>>> from collections import Iterable
>>> isinstance('abc', Iterable)
True
判斷是否爲迭代器的方法類似:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)),Iterator)
True
>>>isinstance('abc',Iterator) //str不是迭代器,因爲不能用next()調用並返回下一個值。
False
如果要將 Iterable
變成 Iterator
,可以用iter()
函數:
>>> isinstance(iter('abc'),Iterator)
True
⚠️注意:
Python的for循環,本質上是通過不斷調用next()函數實現的。
舉個例子:
>>> for x in[1,2,3,4]: print(x)
1
2
3
4
實際上完全等價於:
>>> it =iter([1,2,3,4])
>>> while True:
try:
x = next(it)
except StopIteration:
break
7.20 學習打卡