前言
迭代器貌似是 Python3 才有的(猜的),在廖雪峰大神的網站中 Python2 是沒有迭代器一欄的
可 for 循環的對象
- 常見集合數據類型(迭代對象):list、tuple、dict、set、str
- 生成器 generator
可迭代對象(Iterable)
可以直接用 for 循環的對象都叫可迭代對象
關於 Iterable 的文章可以再看看這篇
https://www.cnblogs.com/poloyy/p/14658433.html
復習下生成器
它可以用 for 循環拿到下一個值,也可以用 .next() 函數來拿到下一個值
迭代器(Iterator)
可以通過 .next() 函數調用並不斷返回下一個值的對象就是迭代器
如何判斷是不是迭代器
可以使用 isinstance() 判斷一個對象是否是 Iterator 對象
print(isinstance([], Iterator)) print(isinstance({}, Iterator)) print(isinstance("test", Iterator)) print(isinstance(1234, Iterator)) print(isinstance([x for x in range(2)], Iterator)) print(isinstance((x for x in range(2)), Iterator)) print(isinstance(enumerate([]), Iterator)) # 輸出結果 False False False False False True True
生成器都是 Iterator 對象,但 list、dict、str 雖然是 Iterable ,卻不是 Iterator
如何變成 Iterator
把 list、dict、str 等 Iterable 變成 Iterator 可以使用 iter() 函數
print(isinstance(iter([]), Iterator)) print(isinstance(iter({}), Iterator)) print(isinstance(iter("test"), Iterator)) print(isinstance(iter([x for x in range(2)]), Iterator)) # 輸出結果 True True True True
注意:非 iterable 對象不能調用這個方法哦,比如整型
為什么 list、dict、str 等數據類型不是 Iterator
- Iterator 對象表示的是一個數據流,Iterator 對象可以被 next() 函數調用並不斷返回下一個數據,直到沒有數據時拋出 StopIteration 錯誤
- 可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過 next() 函數實現按需計算下一個數據,所以 Iterator 的計算是惰性的,只有在需要返回下一個數據時它才會計算
- Iterator 甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的
總結
- 凡是可作用於 for 循環的對象都是 Iterable 類型
- 凡是可作用於 next() 函數的對象都是 Iterator 類型,它們表示一個惰性計算的序列
- 集合數據類型如 list、dict、str 等是 Iterable 但不是 Iterator,不過可以通過 iter() 函數獲得一個 Iterator 對象
- Python 的 for 循環本質上就是通過不斷調用 next() 函數實現的