Python高級特性之迭代器

我們已經(jīng)知道,可以直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種:
一類是集合數(shù)據(jù)類型洗贰,如list找岖、tuple、dict敛滋、set许布、str等;
一類是generator绎晃,包括生成器和帶yield的generator function蜜唾。
這些可以直接作用于for循環(huán)的對象稱為可迭代對象: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
可以使用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藤为、dictstrIterable變成Iterator可以使用iter()函數(shù)夺刑。

>>> isinstance (iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

那為什么list缅疟、dictstr等數(shù)據(jù)類型不是Iterator?
因為Python的Iterator對象表示的是一個數(shù)據(jù)流遍愿,Iterator對象可以被next()函數(shù)調(diào)用并不斷返回下一個數(shù)據(jù)存淫,知道沒有數(shù)據(jù)時拋出StopIteration錯誤≌犹睿可以把這個數(shù)據(jù)流看做是一個有序序列桅咆,但我們卻不能提前知道序列的長度,智能不斷通過next()函數(shù)實現(xiàn)按需計算下一個數(shù)據(jù)坞笙,所以Iterator的計算是惰性的岩饼,只有在需要返回下一個數(shù)據(jù)時它才會計算。
Iterator甚至可以表示一個無限大的數(shù)據(jù)流薛夜,例如全體自然數(shù)籍茧,而使用list是永遠不可能存儲全體自然數(shù)的。
小結(jié)
凡是可作用于for循環(huán)的對象都是Iterable類型梯澜;
凡是可作用于next()函數(shù)的對象都是Iterator類型寞冯,它們表示一個惰性計算的序列;
集合數(shù)據(jù)類型如list腊徙、dict简十、str等是Iterable但不是Iterator,不過可以通過iter()函數(shù)獲得一個Iterator對象撬腾。
Python的for循環(huán)本質(zhì)上就是通過不斷調(diào)用next()函數(shù)實現(xiàn)的螟蝙,例如:

for x in [1, 2, 3, 4, 5]:
  pass

實際上完全等價于:

# 首先獲得Iterator對象:
it = iter([1,2,3,4,5])
# 循環(huán):
while True:
   try:
        # 獲得下一個值:
        x = next(it)
  except StopIteration:
         # 遇到StopIteration就退出循環(huán)
        break
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市民傻,隨后出現(xiàn)的幾起案子胰默,更是在濱河造成了極大的恐慌,老刑警劉巖漓踢,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牵署,死亡現(xiàn)場離奇詭異,居然都是意外死亡喧半,警方通過查閱死者的電腦和手機奴迅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挺据,“玉大人取具,你說我怎么就攤上這事脖隶。” “怎么了暇检?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵产阱,是天一觀的道長。 經(jīng)常有香客問我块仆,道長构蹬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任悔据,我火速辦了婚禮庄敛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜜暑。我一直安慰自己铐姚,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布肛捍。 她就那樣靜靜地躺著隐绵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拙毫。 梳的紋絲不亂的頭發(fā)上依许,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音缀蹄,去河邊找鬼峭跳。 笑死,一個胖子當著我的面吹牛缺前,可吹牛的內(nèi)容都是我干的蛀醉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼衅码,長吁一口氣:“原來是場噩夢啊……” “哼拯刁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逝段,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤垛玻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奶躯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帚桩,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年嘹黔,在試婚紗的時候發(fā)現(xiàn)自己被綠了账嚎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郭蕉,靈堂內(nèi)的尸體忽然破棺而出乏悄,到底是詐尸還是另有隱情,我是刑警寧澤恳不,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站开呐,受9級特大地震影響烟勋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筐付,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一卵惦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓦戚,春花似錦沮尿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至印衔,卻和暖如春啡捶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奸焙。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工瞎暑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人与帆。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓了赌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玄糟。 傳聞我的和親對象是個殘疾皇子勿她,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Python 是一種相當高級的語言,通過 Python 解釋器把符合語法的程序代碼轉(zhuǎn)換成 CPU 能夠執(zhí)行的機器碼...
    Python程序媛閱讀 1,908評論 0 3
  • 1.1==茶凳,is的使用 ·is是比較兩個引用是否指向了同一個對象(引用比較)嫂拴。 ·==是比較兩個對象是否相等。 1...
    TENG書閱讀 731評論 0 0
  • 可以直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種: 一類是集合數(shù)據(jù)類型贮喧,如list筒狠、tuple、dict箱沦、set辩恼、st...
    MORESIR閱讀 237評論 0 0
  • 好似深夜的霧灶伊,化成露水疆前。 也似清晨的鳥,結(jié)伴而行聘萨。 漫山遍野的葡萄啊竹椒, 待你成熟 釀成醇厚酒 空蕩蕩的農(nóng)村啊 春節(jié)...
    凡夫俗子y閱讀 137評論 0 2
  • 001.個人微信如何裝修 個人微信號裝修時,昵稱要保持品牌一致米辐,字數(shù)要短胸完,拼寫簡單,提供標簽翘贮,長期不變赊窥,拿出真誠;...
    陽菌閱讀 258評論 0 0