Python-迭代和迭代器

目錄:http://www.reibang.com/p/863c446364a8

一声邦、迭代

1邀泉、迭代:

在Python中买窟,如果給定一個(gè)list或tuple,我們可以通過(guò)for循環(huán)來(lái)遍歷這個(gè)list或tuple贾铝,這種遍歷我們成為迭代(Iteration)隙轻。

2、可迭代對(duì)象:

(1)垢揩、定義

字面意思:可以進(jìn)行循環(huán)更新的一個(gè)實(shí)實(shí)在在的值玖绿。

專(zhuān)業(yè)角度:內(nèi)部含有'__iter__'方法的對(duì)象。

我們之前學(xué)過(guò)的可迭代對(duì)象有:列表叁巨、字符串斑匪、元組、字典锋勺,集合蚀瘸、range、文件庶橱。

(2)贮勃、獲取對(duì)象的所有方法并且以字符串的形式表現(xiàn):dir()

st1="python"

li1=[1,2,3]

print(dir(st1))? ? ? ? ? ? ? #這是將會(huì)運(yùn)行出st1所有的方法

print(dir(li))

(3)、判斷一個(gè)對(duì)象是否是可迭代對(duì)象

st1="python"

print('__iter__' in dir(st1))? ? #判斷st1是否為可迭代對(duì)象

print('__iter__' in dir(range(10)))? ? ? #判斷range(10)是否為可迭代對(duì)象

運(yùn)行結(jié)果為:

True

True? ? #當(dāng)對(duì)象為可迭代對(duì)象是返回True

或者

from?collections import Iterable? #判斷之前需導(dǎo)入內(nèi)置庫(kù)

s='hello'

print(isinstance(s,Iterable))?????? #判斷是不是可迭代對(duì)象

運(yùn)行結(jié)果為:

True

(4)苏章、可迭代對(duì)象的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

1寂嘉、存儲(chǔ)的數(shù)據(jù)直接能顯示,比較直觀枫绅。

2泉孩、擁有的方法比較多,操作方便并淋。

缺點(diǎn):

1寓搬、占用內(nèi)存

2、不能直接通過(guò)for循環(huán)县耽,不能直接取值(索引订咸,key)

二、迭代器

1酬诀、定義:

內(nèi)部含有'__iter__'方法并且含有'__next__'方法的對(duì)象就是迭代器。

2骆撇、判斷是否為迭代器:

'__iter__'and '__next__'在不在dir(對(duì)象)(我們之前學(xué)過(guò)的迭代器只有文件)

f=open("1.txt","r")

print('__iter__'in dir(f)and '__next__'in dir(f))

運(yùn)行結(jié)果為:

True

3瞒御、可迭代對(duì)象可以轉(zhuǎn)換為迭代器

st1="python"

obj=iter(st1)? ? ?#將st1轉(zhuǎn)換為迭代器

print(obj)? ? ? ? ? ?#輸出的結(jié)果是字符串迭代器對(duì)象的地址

運(yùn)行結(jié)果為:?

<str_iterator object at 0x03716CB0>

##當(dāng)st1為迭代器時(shí)就可以用'__next__'方法了

print(next(obj))? #注意這時(shí)是把obj作為一個(gè)迭代器,并不是st1,st1還是可迭代對(duì)象神郊。

運(yùn)行結(jié)果為:

p? ? #運(yùn)行一次next方法就輸出一次字符肴裙,直到字符串中所有字符全部輸出時(shí)趾唱,再

次運(yùn)行就會(huì)報(bào)錯(cuò)。

print(next(obj))?

print(next(obj))?

print(next(obj))?

print(next(obj))?

print(next(obj))? ??? #這時(shí)字符全部輸出

print(next(obj))? #這時(shí)在print時(shí)就會(huì)報(bào)錯(cuò)

報(bào)錯(cuò)為:

print(next(obj))

StopIteration

4蜻懦、遍歷可迭代對(duì)象和遍歷迭代器的區(qū)別:

#可迭代對(duì)象

li=[1,2,3,4,5,6,7,,8,9,10]

count=0

for i in li:

????if count ==4:

? ? ? ? break

? ? else:

? ? ? ? print(i)

? ? count +=1

count=0

for i in li:

????if count ==6:

break

else:

print(i)

? ? count +=1

運(yùn)行結(jié)果為:

1 2 3 4 1 2 3 4 5 6

#迭代器

li=[1,2,3,4,5,6,7,,8,9,10]

obj=iter(li)

for i in range(4):

? ? print(next(obj))

for i in range(6):

????print(next(obj))

運(yùn)行結(jié)果為:

1

2

3

4

5

6

7

8

9

10

當(dāng)我們遍歷可迭代對(duì)象時(shí)甜癞,每一次循環(huán)都會(huì)開(kāi)頭遍歷。而當(dāng)我們遍歷迭代器時(shí)宛乃,會(huì)接著上次執(zhí)行到的位置再次執(zhí)行悠咱。

5、迭代器的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):
1征炼、節(jié)省內(nèi)存

2.析既、惰性機(jī)制,next一次谆奥,去一個(gè)值眼坏。

缺點(diǎn):

1、速度慢

2酸些、不走回頭路

6宰译、迭代器和可迭代對(duì)象的對(duì)比:

可迭代對(duì)象是一個(gè)操作方法比較多,比較直觀魄懂,存儲(chǔ)數(shù)據(jù)相對(duì)少的一個(gè)數(shù)據(jù)集沿侈。

當(dāng)你側(cè)重于對(duì)于數(shù)據(jù)可以靈活處理,并且內(nèi)存空間足夠逢渔,將數(shù)據(jù)集設(shè)置為可迭代對(duì)象是明確的選擇肋坚。

迭代器是一個(gè)非常節(jié)省內(nèi)存,可以記錄取值位置肃廓,可以直接通過(guò)循環(huán)+next方法取值智厌,但是不直觀,操作方法比較單一的數(shù)據(jù)集盲赊。

當(dāng)你的數(shù)據(jù)量過(guò)大铣鹏,大到足以撐爆你的內(nèi)存或者你以節(jié)省內(nèi)存為首選因素時(shí),將數(shù)據(jù)集設(shè)置為迭代器是一個(gè)不錯(cuò)的選擇哀蘑。

7诚卸、while模擬for的內(nèi)部循環(huán)機(jī)制:

? ?for循環(huán)的循環(huán)對(duì)象一定要是可迭代對(duì)象,但是這不意味著可迭代對(duì)象就可以取值绘迁,因?yàn)閒or循環(huán)的內(nèi)部機(jī)制是:將可迭代對(duì)象轉(zhuǎn)換成迭代器合溺,然后利用next進(jìn)行取值,最后利用異常處理處理StopIteration拋出的異常缀台。

l1 = [1, 2, 3, 4, 5, 6]

# 1 將可迭代對(duì)象轉(zhuǎn)化成迭代器

obj = iter(l1)

# 2,利用while循環(huán)棠赛,next進(jìn)行取值

while 1:

? ? # 3,利用異常處理終止循環(huán)

? ? try:

? ? ? ? print(next(obj))

? ? except StopIteration:

? ? ? ? break


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子睛约,更是在濱河造成了極大的恐慌鼎俘,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辩涝,死亡現(xiàn)場(chǎng)離奇詭異贸伐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)怔揩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)捉邢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沧踏,你說(shuō)我怎么就攤上這事歌逢。” “怎么了翘狱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵秘案,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我潦匈,道長(zhǎng)阱高,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任茬缩,我火速辦了婚禮赤惊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凰锡。我一直安慰自己未舟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布掂为。 她就那樣靜靜地躺著裕膀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勇哗。 梳的紋絲不亂的頭發(fā)上昼扛,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音欲诺,去河邊找鬼抄谐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扰法,可吹牛的內(nèi)容都是我干的蛹含。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼塞颁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挣惰!你這毒婦竟也來(lái)了卧斟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤憎茂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后锤岸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體竖幔,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年是偷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拳氢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛋铆,死狀恐怖馋评,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刺啦,我是刑警寧澤留特,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站玛瘸,受9級(jí)特大地震影響蜕青,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糊渊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一右核、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渺绒,春花似錦贺喝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至针炉,卻和暖如春挠他,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篡帕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工殖侵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镰烧。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓拢军,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親怔鳖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茉唉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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