直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種:
一類是集合數(shù)據(jù)類型撑柔,如list、tuple您访、dict铅忿、set、str等灵汪;
一類是generator檀训,包括生成器和帶yield的generator function。
這些可以直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable
使用isinstance()判斷一個對象是否是Iterable對象:
>>> from collections 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
而生成器不但可以作用于for循環(huán)享言,還可以被next()函數(shù)不斷調(diào)用并返回下一個值峻凫,直到最后拋出StopIteration錯誤表示無法繼續(xù)返回下一個值了。
可以被next()函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator
可以使用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
生成器都是Iterator對象担锤,但list蔚晨、dict、str雖然是Iterable肛循,卻不是Iterator铭腕。
把list、dict多糠、str等Iterable變成Iterator可以使用iter()函數(shù):
isinstance(iter([]), Iterator)
True
isinstance(iter('abc'), Iterator)
True
凡是可作用于for循環(huán)的對象都是Iterable類型累舷;
凡是可作用于next()函數(shù)的對象都是Iterator類型,它們表示一個惰性計算的序列夹孔;
集合數(shù)據(jù)類型如list被盈、dict、str等是Iterable但不是Iterator搭伤,不過可以通過iter()函數(shù)獲得一個Iterator對象只怎。