Python函數(shù)編程——迭代器
我們已經(jīng)知道,可以直接作用于
for
循環(huán)的數(shù)據(jù)類型有以下幾種:
1、類是集合數(shù)據(jù)類型,如
list
、
tuple
、
dict
、
set
、
str
等;
2、一類是
generator
,包括生成器和帶
yield
的generator function。
這些可以直接作用于
for
循環(huán)的對(duì)象統(tǒng)稱為
可迭代對(duì)象:Iterable,可迭代的意思就是可遍歷、可循環(huán)。
可以使用
isinstance()
判斷一個(gè)對(duì)象是否是
Iterable
對(duì)象:
>>> 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)用并返回下一個(gè)值,直到最后拋出StopIteration錯(cuò)誤表示無法繼續(xù)返回下一個(gè)值了。
可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator。
生成器都是
Iterator
對(duì)象,但
list
、
dict
、
str
雖然是
Iterable
,卻不是
Iterator
。
把
list
、
dict
、
str
等
Iterable
變成
Iterator
可以使用
iter()
函數(shù):
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
你可能會(huì)問,為什么
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è)有序序列,但我們卻不能提前知道序列的長度,只能不斷通過
next()
函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以
Iterator
的計(jì)算是惰性的,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算。
Iterator
甚至可以表示一個(gè)無限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲(chǔ)全體自然數(shù)的。
總結(jié)
凡是可作用于
for
循環(huán)的對(duì)象都是
Iterable
類型;
凡是可作用于
next()
函數(shù)的對(duì)象都是
Iterator
類型,它們表示一個(gè)惰性計(jì)算的序列;
集合數(shù)據(jù)類型如
list
、
dict
、
str
等是
Iterable
但不是
Iterator
,不過可以通過
iter()
函數(shù)獲得一個(gè)
Iterator
對(duì)象。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
