凡是可作用於for迴圈的物件都是iterable型別
凡是可作用於next()函式的物件都是iterator型別,它們表示乙個惰性計算的序列
集合資料型別如list、dict、str等是iterable但不是iterator,不過可以通過iter()函式獲得乙個iterator物件。
python的for迴圈本質上就是通過不斷呼叫next()函式實現的,例如:
for x in [1, 2, 3, 4, 5]:
pass
實際上完全等價於:
# 首先獲得iterator物件:
it = iter([1, 2, 3, 4, 5])
# 迴圈:
while true:
try:
# 獲得下乙個值:
x = next(it)
except stopiteration:
# 遇到stopiteration就退出迴圈
break
可以使用isinstance()判斷乙個物件是否是iterator物件:
>>> from collections import iterator
>>> isinstance((x for x in range(10)), iterator)
true
>>> isinstance(, iterator)
false
>>> isinstance({}, iterator)
false
>>> isinstance('abc', iterator)
false
你可能會問,為什麼list、dict、str等資料型別不是iterator?
這是因為python的iterator物件表示的是乙個資料流,iterator物件可以被next()函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下乙個資料,所以iterator的計算是惰性的,只有在需要返回下乙個資料時它才會計算。
iterator甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
Python3 基礎 高階特性 切片和迭代
定義乙個list l michael sarah tracy bob jack 對l進行切片 l 0 3 取索引 0 1 2的內容 或者簡寫 l 3 michael sarah tracy 倒數切片 l 2 bob jack 記住倒數第乙個元素的索引是 1 l 2 1 bob 注意結果取的是 2位置...
Python3(高階特性)
1.例題答案 小寫化含有數字的list l2 s.lower for s in l1 if isinstance s,str true l2.insert key,value for key,value in enumerate l1 if isinstance value,int true l2注...
Python3 高階特性
可迭代物件 集合資料型別 list tuple dict set str generator,包括生成器和帶yield的generator function 可以採用collections模組的iterable型別判斷是否是可迭代物件 from collections import iterable...