在已知的可直接作用于for回圈的資料型別有以下幾種
第一類
- list
- tuple
- dict
- set
- str
第二類
- generator
可直接作用于for回圈的物件統稱為可迭代物件:Iterable
可利用 isinstance() 判斷一個物件是否是 Iterable 物件
from collections.abc import Iterable
isinstance([], Iterable)
>>> True
isinstance({}, Iterable)
>>> True
isinstance('abc', Iterable)
>>> True
isinstance((x for x in range(10)), Iterable)
>>> True
isinstance(100, Iterable)
>>> False
可以被next()函式呼叫并不斷回傳下一個值的物件稱為迭代器:Iterator
可利用 isinstance() 判斷一個物件是否是 Iterable 物件
from collections.abc import Iterator
isinstance((x for x in range(10)), Iterator)
>>> True
isinstance([], Iterator)
>>> False
isinstance({}, Iterator)
>>> False
isinstance(100, Iterator)
>>> False
生成器都是Iterator物件,但list、dict、str雖然是Iterable,卻不是Iterator,
把list、dict、str等Iterable變成Iterator可以使用iter()函式:
isinstance(iter([]), Iterator)
>>> True
isinstance(iter('abc'), Iterator)
>>> True
list、dict、str為啥不是Iterator?
原因:
因為
Python的Iterator物件表示的是一個資料流,Iterator物件可以被next()函式呼叫并不斷回傳下一個資料,直到沒有資料時拋出StopIteration錯誤,可以把這個資料流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實作按需計算下一個資料,所以Iterator的計算是惰性的,只有在需要回傳下一個資料時它才會計算,
Iterator甚至可以表示一個無限大的資料流,例如全體自然數,而使用list是永遠不可能存盤全體自然數的,
小結
-
凡是可作用于for回圈的物件都是Iterable型別;
-
凡是可作用于next()函式的物件都是Iterator型別,它們表示一個惰性計算的序列;
-
集合資料型別如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函式獲得一個Iterator物件,
-
可迭代物件和迭代器,通過函式tier()轉換
-
迭代器:資料流,變長,惰性的
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/83327.html
標籤:Python
上一篇:Django學習筆記 第一節 第一個Django專案
下一篇:解決IDEA/pycharm提示Untrusted Server's certificate 證書不可用( Server's certificate is not trusted )
