Python迭代器

1.迭代和可迭代協(xié)議

????1)什么叫迭代

????????for?i?in?[1,2,3,4]:?

????????????print(i)


????????結(jié)果:

????????????1

????????????2

????????????3

????????????4


????????for?i?in?1234

????????????print(i)?


????????結(jié)果:

????????Traceback (most recent call last):

??????????File?"test.py", line?4,?in?

????????????for?i?in?1234:

????????TypeError:?'int'?object?is?not?iterable?


????????錯誤說,我們的1234不可迭代荚守。上面的卻可以楷兽。

????????那么大膽推測,如果可以迭代,就應(yīng)該可以被for循環(huán)哥谷。


????????我們知道雌芽,字符串、列表败砂、元祖赌渣、集合、字典都可以for循環(huán)

????????說明他們都是可迭代的昌犹。


????????那么正確的路子應(yīng)該是什么樣的呢坚芜,總不能憑空想象。

????????from?collections?import?Iterable?

????????s?=?'1234'

????????l?=?[1,2,3,4]?

????????t?=?(1,2,3,4)?

????????d?=?{1:2,3:4}?

????????s?=?{1,2,3,4}

????????print(isinstance(a,Iterable))#Ture?

????????print(isinstance(l,Iterable))#Ture

????????print(isinstance(t,Iterable))#Ture

????????print(isinstance(d,Iterable))#Ture

????????print(isinstance(s,Iterable))#Ture


????????綜上:可以將某個數(shù)據(jù)集內(nèi)的數(shù)據(jù)“一個挨一個的取出來”斜姥,就叫做迭代鸿竖。


????2)可迭代協(xié)議

????????可以被迭代滿足的要求就叫做可迭代協(xié)議。

????????可迭代協(xié)議铸敏;就是內(nèi)部實現(xiàn)了 __iter__() 方法


????????驗證:

????????????print(dir([1,2]))

????????????print(dir((1,2)))

????????????print(dir({1:2}))

????????????print(dir({1,2}))


????????總結(jié):

????????????可以被for循環(huán)的都是可迭代的缚忧,想要可迭代,內(nèi)部必須有一個

????????????__iter__() 方法搞坝。


????????????接著分析搔谴,這個 __iter__()做了什么事情?

????????????print([1,2].__iter__())


????????????結(jié)果

????????????

????????????這里的iterator就是迭代器桩撮。


2.迭代器


????可迭代后又一難題出現(xiàn)了敦第,什么叫“迭代器”?

????'''

????dir([1,2].__iter__())是列表迭代器中實現(xiàn)的所有方法店量,

????dir([1,2])是列表中實現(xiàn)的所有方法,都是以列表的形式返

????回給我們的芜果,為了看的更清楚,我們分別把他們轉(zhuǎn)換成集合融师,

????然后取差集右钾。

????'''

????#print(dir([1,2].__iter__()))

????#print(dir([1,2]))

????print(set(dir([1,2].__iter__()))-set(dir([1,2])))


????結(jié)果:

????{'__length_hint__',?'__next__',?'__setstate__'}


????我們看到在列表迭代器中多了三個方法,那么這三個方法都是

????干什么的呢?


????????iter_l?=?[1,2,3,4,5,6].__iter__()#列表迭代器

????????#獲取迭代器中元素的長度

????????print(iter_l.__length_hint__())

????????#根據(jù)索引值指定從哪里開始迭代

????????print('*',iter_l.__setstate__(4))

????????#一個一個的取值

????????print('**',iter_l.__next__())

????????print('***',iter_l.__next__())


????????結(jié)果:

????????????6

????????????*?None

????????????**?5

????????????***?6

????這三個方法中舀射,能夠一個一個取值的方法就是 __next__()

????在for循環(huán)中窘茁,就是在內(nèi)部調(diào)用了 __next__() 方法才能取到

????一個一個的值。


????例子:

????????l?=?[1,2,3]

????????l_iter?=?l.__iter__()

????????item?=?l_iter.__next__()

????????print(item)#1

????????item?=?l_iter.__next__()

????????print(item)#2

????????item?=?l_iter.__next__()

????????print(item)#3

????????item?=?l_iter.__next__()

????????print(item)#StopIteration


????????注意:

????????????如果我們一直取脆烟,直到next取到迭代器里已經(jīng)沒有元素了山林,

????????????就會拋出一個StopIteration異常,告訴我們邢羔,列表中已經(jīng)

????????????沒有有效元素了驼抹。


????????????這個時候,我們就要使用異常處理機制來把這個異常處理掉拜鹤。


????????????例子:

????????????????lis?=?['1',?'2',?'3']

????????????????it?=?lis.__iter__()

????????????????while?1:

????????????????????try:

????????????????????????res?=?it.__next__()

????????????????????????print(res)

????????????????????except?StopIteration:

????????????????????????break


????????????????結(jié)果:

????????????????????1

????????????????????2

????????????????????3


????注:

????????迭代器遵循迭代器協(xié)議:必須擁有 __iter__()方法和__next__()方法框冀。


????????# 迭代器的特點:

????????#?? 1. 節(jié)省內(nèi)存

????????#?? 2. 惰性機制

????????#?? 3. 只能往前拿. 不能反著拿


3.判斷對象是迭代器還是可迭代對象

????例子:

????????from?collections?import?Iterator

????????from?collections?import?Iterable

????????print(isinstance(range(10), Iterator))#False

????????print(isinstance(range(10), Iterable))#Ture




????????>>>?from?collections?import?Iterator

????????>>>?isinstance((x?for?x?in?range(10)), Iterator)

????????True

????????>>>?isinstance([], Iterator)

????????False

????????>>>?isinstance({}, Iterator)

????????False

????????>>>?isinstance('abc', Iterator)

????????False





????????>>>?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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市敏簿,隨后出現(xiàn)的幾起案子明也,更是在濱河造成了極大的恐慌,老刑警劉巖极谊,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诡右,死亡現(xiàn)場離奇詭異,居然都是意外死亡轻猖,警方通過查閱死者的電腦和手機帆吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咙边,“玉大人猜煮,你說我怎么就攤上這事“苄恚” “怎么了王带?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長市殷。 經(jīng)常有香客問我愕撰,道長,這世上最難降的妖魔是什么醋寝? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任搞挣,我火速辦了婚禮,結(jié)果婚禮上音羞,老公的妹妹穿的比我還像新娘囱桨。我一直安慰自己,他們只是感情好嗅绰,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布舍肠。 她就那樣靜靜地躺著搀继,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翠语。 梳的紋絲不亂的頭發(fā)上叽躯,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音肌括,去河邊找鬼险毁。 笑死,一個胖子當著我的面吹牛们童,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲸鹦,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼慧库,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馋嗜?” 一聲冷哼從身側(cè)響起齐板,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葛菇,沒想到半個月后甘磨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡眯停,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年济舆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莺债。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡滋觉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出齐邦,到底是詐尸還是另有隱情椎侠,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布措拇,位于F島的核電站我纪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丐吓。R本人自食惡果不足惜浅悉,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汰蜘。 院中可真熱鬧仇冯,春花似錦、人聲如沸族操。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泼舱,卻和暖如春等缀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背娇昙。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工尺迂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冒掌。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓噪裕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親股毫。 傳聞我的和親對象是個殘疾皇子膳音,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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