摘要:其實(shí),迭代器遠(yuǎn)遠(yuǎn)不止上述這么簡(jiǎn)單,下面我們隨便列舉一些,在中還可以這樣得到迭代對(duì)象中的元素。
跟一些比較牛X的程序員交流,經(jīng)常聽(tīng)到他們嘴里冒出一個(gè)不標(biāo)準(zhǔn)的英文單詞,而loop、iterate、traversal和recursion如果不在其內(nèi),總覺(jué)得他還不夠牛X。當(dāng)讓?zhuān)嬲的絕對(duì)不會(huì)這么說(shuō)的,他們只是說(shuō)“循環(huán)、迭代、遍歷、遞歸”,然后再問(wèn)“這個(gè)你懂嗎?”。哦,這就是真正牛X的程序員。不過(guò),他也僅僅是牛X罷了,還不是大神。大神程序員是什么樣兒呢?他是掃地僧,大隱隱于市。
先搞清楚這些名詞再說(shuō)別的:
循環(huán)(loop),指的是在滿(mǎn)足條件的情況下,重復(fù)執(zhí)行同一段代碼。比如,while語(yǔ)句。
迭代(iterate),指的是按照某種順序逐個(gè)訪問(wèn)列表中的每一項(xiàng)。比如,for語(yǔ)句。
遞歸(recursion),指的是一個(gè)函數(shù)不斷調(diào)用自身的行為。比如,以編程方式輸出著名的斐波納契數(shù)列。
遍歷(traversal),指的是按照一定的規(guī)則訪問(wèn)樹(shù)形結(jié)構(gòu)中的每個(gè)節(jié)點(diǎn),而且每個(gè)節(jié)點(diǎn)都只訪問(wèn)一次。
對(duì)于這四個(gè)聽(tīng)起來(lái)高深莫測(cè)的詞匯,在教程中,已經(jīng)涉及到了一個(gè)——循環(huán)(loop),本經(jīng)主要介紹一下迭代(iterate),看官在網(wǎng)上google,就會(huì)發(fā)現(xiàn),對(duì)于迭代和循環(huán)、遞歸之間的比較的文章不少,分別從不同角度將它們進(jìn)行了對(duì)比。這里暫不比較,先搞明白python中的迭代。之后適當(dāng)時(shí)機(jī)再比較,如果我不忘記的話(huà),哈哈。
逐個(gè)訪問(wèn)在python中,訪問(wèn)對(duì)象中每個(gè)元素,可以這么做:(例如一個(gè)list)
>>> lst ["q", "i", "w", "s", "i", "r"] >>> for i in lst: ... print i, ... q i w s i r
除了這種方法,還可以這樣:
>>> lst_iter = iter(lst) #對(duì)原來(lái)的list實(shí)施了一個(gè)iter() >>> lst_iter.next() #要不厭其煩地一個(gè)一個(gè)手動(dòng)訪問(wèn) "q" >>> lst_iter.next() "i" >>> lst_iter.next() "w" >>> lst_iter.next() "s" >>> lst_iter.next() "i" >>> lst_iter.next() "r" >>> lst_iter.next() Traceback (most recent call last): File "", line 1, in StopIteration
做為一名優(yōu)秀的程序員,最佳品質(zhì)就是“懶惰”,當(dāng)然不能這樣一個(gè)一個(gè)地敲啦,于是就:
>>> while True: ... print lst_iter.next() ... Traceback (most recent call last): #居然報(bào)錯(cuò),而且錯(cuò)誤跟前面一樣?什么原因 File "", line 2, in StopIteration >>> lst_iter = iter(lst) #那就再寫(xiě)一遍,上面的錯(cuò)誤暫且擱置,回頭在研究 >>> while True: ... print lst_iter.next() ... q #果然自動(dòng)化地讀取了 i w s i r Traceback (most recent call last): #讀取到最后一個(gè)之后,報(bào)錯(cuò),停止循環(huán) File " ", line 2, in StopIteration >>>
首先了解一下上面用到的那個(gè)內(nèi)置函數(shù):iter(),官方文檔中有這樣一段話(huà)描述之:
iter(o[, sentinel])
Return an iterator object. The first argument is interpreted very differently depending on the presence of the second argument. Without a second argument, o must be a collection object which supports the iteration protocol (the iter() method), or it must support the sequence protocol (the getitem() method with integer arguments starting at 0). If it does not support either of those protocols, TypeError is raised. If the second argument, sentinel, is given, then o must be a callable object. The iterator created in this case will call o with no arguments for each call to its next() method; if the value returned is equal to sentinel, StopIteration will be raised, otherwise the value will be returned.
大意是說(shuō)...(此處故意省略若干字,因?yàn)槲蚁嘈趴创宋恼碌目垂儆⒄Z(yǔ)水平是達(dá)到看文檔的水平了,乳溝沒(méi)有,也不用著急,找個(gè)詞典什么的幫助一下。)
盡管不翻譯了,但是還要提煉一下主要的東西:
返回值是一個(gè)迭代器對(duì)象
參數(shù)需要是一個(gè)符合迭代協(xié)議的對(duì)象或者是一個(gè)序列對(duì)象
next()配合與之使用
什么是“可迭代的對(duì)象”呢?一般,我們常常將哪些能夠用for來(lái)一個(gè)一個(gè)讀取元素的對(duì)象,就稱(chēng)之為可迭代的對(duì)象。那么for也就被稱(chēng)之為迭代工具。所謂迭代工具,就是能夠按照一定順序掃描迭代對(duì)象的每個(gè)元素(按照從左到右的順序),顯然,除了for之外,還有別的可以稱(chēng)作迭代工具,比如列表解析,in來(lái)判斷某元素是否屬于序列對(duì)象等。
那么,剛才介紹的iter()的功能呢?它與next()配合使用,也是實(shí)現(xiàn)上述迭代工具的作用。在python中,甚至在其它的語(yǔ)言中,迭代這塊的說(shuō)法比較亂,主要是名詞亂,剛才我們說(shuō),那些能夠?qū)崿F(xiàn)迭代的東西,稱(chēng)之為迭代工具,就是這些迭代工具,不少程序員都喜歡叫做迭代器。當(dāng)然,這都是漢語(yǔ)翻譯,英語(yǔ)就是iterator。
看官看上面的所有例子會(huì)發(fā)現(xiàn),如果用for來(lái)迭代,當(dāng)?shù)侥┪驳臅r(shí)候,就自動(dòng)結(jié)束了,不會(huì)報(bào)錯(cuò)。如果用iter()...next()迭代,當(dāng)最后一個(gè)完成之后,它不會(huì)自動(dòng)結(jié)束,還要向下繼續(xù),但是后面沒(méi)有元素了,于是就報(bào)一個(gè)稱(chēng)之為StopIteration的錯(cuò)誤(這個(gè)錯(cuò)誤的名字叫做:停止迭代,這哪里是報(bào)錯(cuò),分明是警告)。
看官還要關(guān)注iter()...next()迭代的一個(gè)特點(diǎn)。當(dāng)?shù)鷮?duì)象lst_iter被迭代結(jié)束,即每個(gè)元素都讀取一邊之后,指針就移動(dòng)到了最后一個(gè)元素的后面。如果再訪問(wèn),指針并沒(méi)有自動(dòng)返回到首位置,而是仍然停留在末位置,所以報(bào)StopIteration,想要再開(kāi)始,需要重新再入迭代對(duì)象。所以,列位就看到,當(dāng)我在上面重新進(jìn)行迭代對(duì)象賦值之后,又可以繼續(xù)了。這在for等類(lèi)型的迭代工具中是沒(méi)有的。
文件迭代器現(xiàn)在有一個(gè)文件,名稱(chēng):208.txt,其內(nèi)容如下:
Learn python with qiwsir. There is free python course. The website is: http://qiwsir.github.io Its language is Chinese.
用迭代器來(lái)操作這個(gè)文件,我們?cè)谇懊嬷v述文件有關(guān)知識(shí)的時(shí)候已經(jīng)做過(guò)了,無(wú)非就是:
>>> f = open("208.txt") >>> f.readline() #讀第一行 "Learn python with qiwsir. " >>> f.readline() #讀第二行 "There is free python course. " >>> f.readline() #讀第三行 "The website is: " >>> f.readline() #讀第四行 "http://qiwsir.github.io " >>> f.readline() #讀第五行,也就是這真在讀完最后一行之后,到了此行的后面 "Its language is Chinese. " >>> f.readline() #無(wú)內(nèi)容了,但是不報(bào)錯(cuò),返回空。 ""
以上演示的是用readline()一行一行地讀。當(dāng)然,在實(shí)際操作中,我們是絕對(duì)不能這樣做的,一定要讓它自動(dòng)進(jìn)行,比較常用的方法是:
>>> for line in f: #這個(gè)操作是緊接著上面的操作進(jìn)行的,請(qǐng)看官主要觀察 ... print line, #沒(méi)有打印出任何東西 ...
這段代碼之所沒(méi)有打印出東西來(lái),是因?yàn)榻?jīng)過(guò)前面的迭代,指針已經(jīng)移到了最后了。這就是迭代的一個(gè)特點(diǎn),要小心指針的位置。
>>> f = open("208.txt") #從頭再來(lái) >>> for line in f: ... print line, ... Learn python with qiwsir. There is free python course. The website is: http://qiwsir.github.io Its language is Chinese.
這種方法是讀取文件常用的。另外一個(gè)readlines()也可以。但是,需要有一些小心的地方,看官如果想不起來(lái)小心什么,可以在將關(guān)于文件的課程復(fù)習(xí)一邊。
上面過(guò)程用next()也能夠讀取。
>>> f = open("208.txt") >>> f.next() "Learn python with qiwsir. " >>> f.next() "There is free python course. " >>> f.next() "The website is: " >>> f.next() "http://qiwsir.github.io " >>> f.next() "Its language is Chinese. " >>> f.next() Traceback (most recent call last): File "", line 1, in StopIteration
如果用next(),就可以直接讀取每行的內(nèi)容。這說(shuō)明文件是天然的可迭代對(duì)象,不需要用iter()轉(zhuǎn)換了。
再有,我們用for來(lái)實(shí)現(xiàn)迭代,在本質(zhì)上,就是自動(dòng)調(diào)用next(),只不過(guò)這個(gè)工作,已經(jīng)讓for偷偷地替我們干了,到這里,列位是不是應(yīng)該給for取另外一個(gè)名字:它叫雷鋒。
前面提到了,列表解析也能夠做為迭代工具,在研究列表的時(shí)候,看官想必已經(jīng)清楚了。那么對(duì)文件,是否可以用?試一試:
>>> [ line for line in open("208.txt") ] ["Learn python with qiwsir. ", "There is free python course. ", "The website is: ", "http://qiwsir.github.io ", "Its language is Chinese. "]
至此,看官難道還不為列表解析所折服嗎?真的很強(qiáng)大,又強(qiáng)又大呀。
其實(shí),迭代器遠(yuǎn)遠(yuǎn)不止上述這么簡(jiǎn)單,下面我們隨便列舉一些,在python中還可以這樣得到迭代對(duì)象中的元素。
>>> list(open("208.txt")) ["Learn python with qiwsir. ", "There is free python course. ", "The website is: ", "http://qiwsir.github.io ", "Its language is Chinese. "] >>> tuple(open("208.txt")) ("Learn python with qiwsir. ", "There is free python course. ", "The website is: ", "http://qiwsir.github.io ", "Its language is Chinese. ") >>> "$$$".join(open("208.txt")) "Learn python with qiwsir. $$$There is free python course. $$$The website is: $$$http://qiwsir.github.io $$$Its language is Chinese. " >>> a,b,c,d,e = open("208.txt") >>> a "Learn python with qiwsir. " >>> b "There is free python course. " >>> c "The website is: " >>> d "http://qiwsir.github.io " >>> e "Its language is Chinese. "
上述方式,在編程實(shí)踐中不一定用得上,只是向看官展示一下,并且看官要明白,可以這么做,不是非要這么做。
補(bǔ)充一下,字典也可以迭代,看官自己不妨摸索一下(其實(shí)前面已經(jīng)用for迭代過(guò)了,這次請(qǐng)摸索一下用iter()...next()手動(dòng)一步一步迭代)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37365.html
摘要:在講述有關(guān)的時(shí)候,提到做游戲的事情后來(lái)這個(gè)事情一直沒(méi)有接續(xù)。現(xiàn)在就是開(kāi)始做那個(gè)游戲的時(shí)候了。游戲過(guò)程描述程序運(yùn)行起來(lái),隨機(jī)在某個(gè)范圍內(nèi)選擇一個(gè)整數(shù)。我們現(xiàn)在做一個(gè)很小的程序,也是這樣來(lái)做。這個(gè)游戲還沒(méi)有完呢,即使用了循環(huán),后面還會(huì)繼續(xù)。 在講述有關(guān)list的時(shí)候,提到做游戲的事情,后來(lái)這個(gè)事情一直沒(méi)有接續(xù)。不是忘記了,是在想在哪個(gè)階段做最合適。經(jīng)過(guò)一段時(shí)間學(xué)習(xí),看官已經(jīng)不是純粹小白了,...
摘要:列入全國(guó)計(jì)算機(jī)二級(jí)取代,部分城市試點(diǎn),引入高中。建議通過(guò)視頻學(xué)習(xí),這樣不但節(jié)省時(shí)間,而且效果很好。能否回憶起那個(gè)陡峭的學(xué)習(xí)曲線問(wèn)題越多,學(xué)的越快。出報(bào)告每完成一個(gè)項(xiàng)目,總結(jié)報(bào)告,必不可少。結(jié)構(gòu)化學(xué)習(xí),才是你我需要真正培養(yǎng)的能力。 編程就如同你學(xué)習(xí)開(kāi)車(chē),即使,你可以一口氣,說(shuō)出一輛車(chē)的全部零部件,以及內(nèi)燃機(jī)進(jìn)氣、壓縮、做功和排氣過(guò)程,但你就是不去練如何開(kāi)車(chē),怎么上路。你確定,你敢開(kāi)嗎?你...
摘要:軟件文檔或者源代碼文檔是指與軟件系統(tǒng)及其軟件工程過(guò)程有關(guān)聯(lián)的文本實(shí)體。而則認(rèn)為軟件文檔是被軟件工程師之間用作溝通交流的一種方式,溝通的信息主要是有關(guān)所開(kāi)發(fā)的軟件系統(tǒng)。則強(qiáng)調(diào)文檔的權(quán)威性,他認(rèn)為文檔應(yīng)該提供對(duì)軟件系統(tǒng)的精確描述。 文檔,這個(gè)詞語(yǔ)在經(jīng)常在程序員的嘴里冒出來(lái),有時(shí)候他們還經(jīng)常以文檔有沒(méi)有或者全不全為標(biāo)準(zhǔn)來(lái)衡量一個(gè)軟件項(xiàng)目是否高大上。那么,軟件中的文檔是什么呢?有什么要求呢?p...
摘要:每個(gè)形參的名稱(chēng)均可作為過(guò)程內(nèi)的局部變量。實(shí)參表示在您調(diào)用過(guò)程時(shí)傳遞給過(guò)程形參的值。看官如果硬著頭皮看完這段引文,發(fā)現(xiàn)里面有幾個(gè)關(guān)鍵詞參數(shù)變量形參實(shí)參。好似全局變量能力很強(qiáng)悍,能夠統(tǒng)帥函數(shù)內(nèi)外。 對(duì)于變量和參數(shù),不管是已經(jīng)敲代碼多年的老鳥(niǎo),還是剛剛接觸編程的小白,都會(huì)有時(shí)候清楚,有時(shí)候又有點(diǎn)模糊。因?yàn)?,在?shí)際應(yīng)用中,它們之間分分離離,比如,敲代碼都知道,x=3中x是變量,它不是參數(shù),但是...
摘要:語(yǔ)句,遍列列表字符串字典集合等迭代器,依次處理迭代器中的每個(gè)元素。與配合使用處理在程序運(yùn)行中出現(xiàn)的異常情況。表示此行為空,不運(yùn)行任何操作。在迭代器函數(shù)內(nèi)使用,用于返回一個(gè)元素。恭請(qǐng)到上瀏覽及時(shí)更新的教程零基礎(chǔ)學(xué) 小孩子剛剛開(kāi)始學(xué)說(shuō)話(huà)的時(shí)候,常常是一個(gè)字一個(gè)字地開(kāi)始學(xué),比如學(xué)說(shuō)餃子,對(duì)他/她來(lái)講,似乎有點(diǎn)難度,大人也聰明,于是就簡(jiǎn)化了,用餃餃來(lái)代替,其實(shí)就是讓孩子學(xué)會(huì)一個(gè)字就能表達(dá)。當(dāng)然...
閱讀 2042·2023-04-26 01:33
閱讀 1669·2023-04-26 00:52
閱讀 1052·2021-11-18 13:14
閱讀 5466·2021-09-26 10:18
閱讀 2919·2021-09-22 15:52
閱讀 1498·2019-08-29 17:15
閱讀 3027·2019-08-29 16:11
閱讀 1046·2019-08-29 16:11