我們已經(jīng)知道,可以直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種:
一類是集合數(shù)據(jù)類型肪笋,list月劈,tuple,dict藤乙,set猜揪,str等;一類是generator坛梁,包括生成器和yield而姐。這些可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象:
>>> from collections import Iterable
>>> isintance([],Iterable)
True
>>> isinstance({},Iterable)
True
>>> isintance('abc', Iterable)
True
>>> isintance(100, Iterable)
False
可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterable划咐。
可以使用isintance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象:
>>> from collections import Iterator
>>> isinstance ((x for x in range(10)), Iterator)
True
>>> isintance ([], Iterator)
False
>>> isintance({}, Iterator)
False
>>> isintance('abc', Iterator)
False
生成器都是Iterator對(duì)象拴念,但list,dict褐缠,str雖然是Iterable政鼠,卻不是Iterator。
把list队魏,dict公般,str,等Iterable變成Iterator可以使用iter()函數(shù):
>>> isinstance(iter[], Iterator)
True
>>> isinstance(iter('abc'), Iterator)
python的Iterator對(duì)象是一個(gè)數(shù)據(jù)流,Iterator對(duì)象可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)數(shù)據(jù)官帘,知道沒有數(shù)據(jù)拋出瞬雹。可以吧這個(gè)數(shù)據(jù)流看成是一個(gè)有序序列刽虹,但我們卻不能提前知道序列的長度酗捌,只能不斷通過next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以涌哲,Iterator的計(jì)算是惰性的意敛,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才計(jì)算。
python的for循環(huán)本質(zhì)上就是通過不斷調(diào)用next()函數(shù)實(shí)現(xiàn)的:
for x in [1,2,3,4,5]:
pass
實(shí)際上完全等價(jià)于:
# 首先獲得Iterator對(duì)象:
it = iter([1,2,3,4,5])
# 循環(huán):
while True:
try:
#獲得下一個(gè)值:
x = next(it)
except StopIteration:
# 遇到StopIterator就退出循環(huán)
break