高級(jí)特性 之 迭代器 Iterator
from collections import Iterable # 可迭代對(duì)象
from collections import Iterator # 迭代器
# 檢驗(yàn)是否是可迭代對(duì)象
print('# 檢驗(yàn)是否是可迭代對(duì)象')
print(isinstance([], Iterable))
print(isinstance({}, Iterable))
print(isinstance('abc', Iterable))
print(isinstance(123, Iterable))
print(isinstance({'dd':12, 'pp': 21}, Iterable))
def g():
yield 1
yield 2
print(isinstance(g(), Iterable))
# 檢驗(yàn)是否是迭代器
print('# 檢驗(yàn)是否是迭代器')
print(isinstance([], Iterator))
print(isinstance({}, Iterator))
print(isinstance('abc', Iterator))
print(isinstance(123, Iterator))
print(isinstance({'dd':12, 'pp': 21}, Iterator))
def g():
yield 1
yield 2
print(isinstance(g(), Iterator))
# 結(jié)果只有g(shù)enerator對(duì)象是迭代器Iterator ,list tuple str等 都不是 ,那么 我們需要怎么轉(zhuǎn)換呢? 這里需要用到iter()函數(shù) 來(lái)進(jìn)行轉(zhuǎn)換
# iter()函數(shù) 是將可迭代對(duì)象轉(zhuǎn)換為迭代器
print('# iter()函數(shù) 是將可迭代對(duì)象轉(zhuǎn)換為迭代器')
print(isinstance(iter([]), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter('abc'), Iterator))
# print(isinstance(iter(123), Iterator)) # 報(bào)錯(cuò) TypeError: 'int' object is not iterable
print(isinstance(iter({'dd':12, 'pp': 21}), Iterator))
你可能會(huì)問(wèn),為什么list、dict、str等數(shù)據(jù)類型不是Iterator?
這是因?yàn)镻ython的Iterator對(duì)象表示的是一個(gè)數(shù)據(jù)流,Iterator對(duì)象可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時(shí)拋出StopIteration錯(cuò)誤。可以把這個(gè)數(shù)據(jù)流看做是一個(gè)有序序列,
但我們卻不能提前知道序列的長(zhǎng)度,只能不斷通過(guò)next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以Iterator的計(jì)算是惰性的,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算。
小結(jié)
凡是可作用于for循環(huán)的對(duì)象都是Iterable類型;
凡是可作用于next()函數(shù)的對(duì)象都是Iterator類型,它們表示一個(gè)惰性計(jì)算的序列;
集合數(shù)據(jù)類型如list、dict、str等是Iterable但不是Iterator,不過(guò)可以通過(guò)iter()函數(shù)獲得一個(gè)Iterator對(duì)象。
關(guān)注一波!喜歡一波!本人是前端菜鳥,正在做自己的個(gè)人博客鄧鵬的博客,歡迎來(lái)交流學(xué)習(xí), 使用的技術(shù) vue + koa2 + mysql + php + nginx!