国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[零基礎學python]讓人歡喜讓人憂的迭代

DrizzleX / 1321人閱讀

摘要:其實,迭代器遠遠不止上述這么簡單,下面我們隨便列舉一些,在中還可以這樣得到迭代對象中的元素。

跟一些比較牛X的程序員交流,經常聽到他們嘴里冒出一個不標準的英文單詞,而loop、iterate、traversal和recursion如果不在其內,總覺得他還不夠牛X。當讓,真正牛X的絕對不會這么說的,他們只是說“循環、迭代、遍歷、遞歸”,然后再問“這個你懂嗎?”。哦,這就是真正牛X的程序員。不過,他也僅僅是牛X罷了,還不是大神。大神程序員是什么樣兒呢?他是掃地僧,大隱隱于市。

先搞清楚這些名詞再說別的:

循環(loop),指的是在滿足條件的情況下,重復執行同一段代碼。比如,while語句。

迭代(iterate),指的是按照某種順序逐個訪問列表中的每一項。比如,for語句。

遞歸(recursion),指的是一個函數不斷調用自身的行為。比如,以編程方式輸出著名的斐波納契數列。

遍歷(traversal),指的是按照一定的規則訪問樹形結構中的每個節點,而且每個節點都只訪問一次。

對于這四個聽起來高深莫測的詞匯,在教程中,已經涉及到了一個——循環(loop),本經主要介紹一下迭代(iterate),看官在網上google,就會發現,對于迭代和循環、遞歸之間的比較的文章不少,分別從不同角度將它們進行了對比。這里暫不比較,先搞明白python中的迭代。之后適當時機再比較,如果我不忘記的話,哈哈。

逐個訪問

在python中,訪問對象中每個元素,可以這么做:(例如一個list)

>>> lst
["q", "i", "w", "s", "i", "r"]
>>> for i in lst:
...     print i,
... 
q i w s i r

除了這種方法,還可以這樣:

>>> lst_iter = iter(lst)    #對原來的list實施了一個iter()
>>> lst_iter.next()         #要不厭其煩地一個一個手動訪問
"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

做為一名優秀的程序員,最佳品質就是“懶惰”,當然不能這樣一個一個地敲啦,于是就:

>>> while True:
...     print lst_iter.next()
... 
Traceback (most recent call last):      #居然報錯,而且錯誤跟前面一樣?什么原因
  File "", line 2, in 
StopIteration

>>> lst_iter = iter(lst)                #那就再寫一遍,上面的錯誤暫且擱置,回頭在研究
>>> while True:
...     print lst_iter.next()
... 
q                                       #果然自動化地讀取了
i
w
s
i
r
Traceback (most recent call last):      #讀取到最后一個之后,報錯,停止循環
  File "", line 2, in 
StopIteration
>>> 

首先了解一下上面用到的那個內置函數:iter(),官方文檔中有這樣一段話描述之:

  

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.

大意是說...(此處故意省略若干字,因為我相信看此文章的看官英語水平是達到看文檔的水平了,乳溝沒有,也不用著急,找個詞典什么的幫助一下。)

盡管不翻譯了,但是還要提煉一下主要的東西:

返回值是一個迭代器對象

參數需要是一個符合迭代協議的對象或者是一個序列對象

next()配合與之使用

什么是“可迭代的對象”呢?一般,我們常常將哪些能夠用for來一個一個讀取元素的對象,就稱之為可迭代的對象。那么for也就被稱之為迭代工具。所謂迭代工具,就是能夠按照一定順序掃描迭代對象的每個元素(按照從左到右的順序),顯然,除了for之外,還有別的可以稱作迭代工具,比如列表解析,in來判斷某元素是否屬于序列對象等。

那么,剛才介紹的iter()的功能呢?它與next()配合使用,也是實現上述迭代工具的作用。在python中,甚至在其它的語言中,迭代這塊的說法比較亂,主要是名詞亂,剛才我們說,那些能夠實現迭代的東西,稱之為迭代工具,就是這些迭代工具,不少程序員都喜歡叫做迭代器。當然,這都是漢語翻譯,英語就是iterator。

看官看上面的所有例子會發現,如果用for來迭代,當到末尾的時候,就自動結束了,不會報錯。如果用iter()...next()迭代,當最后一個完成之后,它不會自動結束,還要向下繼續,但是后面沒有元素了,于是就報一個稱之為StopIteration的錯誤(這個錯誤的名字叫做:停止迭代,這哪里是報錯,分明是警告)。

看官還要關注iter()...next()迭代的一個特點。當迭代對象lst_iter被迭代結束,即每個元素都讀取一邊之后,指針就移動到了最后一個元素的后面。如果再訪問,指針并沒有自動返回到首位置,而是仍然停留在末位置,所以報StopIteration,想要再開始,需要重新再入迭代對象。所以,列位就看到,當我在上面重新進行迭代對象賦值之后,又可以繼續了。這在for等類型的迭代工具中是沒有的。

文件迭代器

現在有一個文件,名稱:208.txt,其內容如下:

Learn python with qiwsir.
There is free python course.
The website is:
http://qiwsir.github.io
Its language is Chinese.

用迭代器來操作這個文件,我們在前面講述文件有關知識的時候已經做過了,無非就是:

>>> 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()        #無內容了,但是不報錯,返回空。
""

以上演示的是用readline()一行一行地讀。當然,在實際操作中,我們是絕對不能這樣做的,一定要讓它自動進行,比較常用的方法是:

>>> for line in f:     #這個操作是緊接著上面的操作進行的,請看官主要觀察
...     print line,    #沒有打印出任何東西 
... 

這段代碼之所沒有打印出東西來,是因為經過前面的迭代,指針已經移到了最后了。這就是迭代的一個特點,要小心指針的位置。

>>> f = open("208.txt")     #從頭再來
>>> 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.

這種方法是讀取文件常用的。另外一個readlines()也可以。但是,需要有一些小心的地方,看官如果想不起來小心什么,可以在將關于文件的課程復習一邊。

上面過程用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(),就可以直接讀取每行的內容。這說明文件是天然的可迭代對象,不需要用iter()轉換了。

再有,我們用for來實現迭代,在本質上,就是自動調用next(),只不過這個工作,已經讓for偷偷地替我們干了,到這里,列位是不是應該給for取另外一個名字:它叫雷鋒。

前面提到了,列表解析也能夠做為迭代工具,在研究列表的時候,看官想必已經清楚了。那么對文件,是否可以用?試一試:

>>> [ 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.
"]

至此,看官難道還不為列表解析所折服嗎?真的很強大,又強又大呀。

其實,迭代器遠遠不止上述這么簡單,下面我們隨便列舉一些,在python中還可以這樣得到迭代對象中的元素。

>>> 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.
"

上述方式,在編程實踐中不一定用得上,只是向看官展示一下,并且看官要明白,可以這么做,不是非要這么做。

補充一下,字典也可以迭代,看官自己不妨摸索一下(其實前面已經用for迭代過了,這次請摸索一下用iter()...next()手動一步一步迭代)。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37365.html

相關文章

  • [基礎Python]做一個小游戲

    摘要:在講述有關的時候,提到做游戲的事情后來這個事情一直沒有接續。現在就是開始做那個游戲的時候了。游戲過程描述程序運行起來,隨機在某個范圍內選擇一個整數。我們現在做一個很小的程序,也是這樣來做。這個游戲還沒有完呢,即使用了循環,后面還會繼續。 在講述有關list的時候,提到做游戲的事情,后來這個事情一直沒有接續。不是忘記了,是在想在哪個階段做最合適。經過一段時間學習,看官已經不是純粹小白了,...

    idisfkj 評論0 收藏0
  • python12小時后,告訴你,python真沒你想的那么難!

    摘要:列入全國計算機二級取代,部分城市試點,引入高中。建議通過視頻學習,這樣不但節省時間,而且效果很好。能否回憶起那個陡峭的學習曲線問題越多,學的越快。出報告每完成一個項目,總結報告,必不可少。結構化學習,才是你我需要真正培養的能力。 編程就如同你學習開車,即使,你可以一口氣,說出一輛車的全部零部件,以及內燃機進氣、壓縮、做功和排氣過程,但你就是不去練如何開車,怎么上路。你確定,你敢開嗎?你...

    Kaede 評論0 收藏0
  • [基礎python]Python文檔

    摘要:軟件文檔或者源代碼文檔是指與軟件系統及其軟件工程過程有關聯的文本實體。而則認為軟件文檔是被軟件工程師之間用作溝通交流的一種方式,溝通的信息主要是有關所開發的軟件系統。則強調文檔的權威性,他認為文檔應該提供對軟件系統的精確描述。 文檔,這個詞語在經常在程序員的嘴里冒出來,有時候他們還經常以文檔有沒有或者全不全為標準來衡量一個軟件項目是否高大上。那么,軟件中的文檔是什么呢?有什么要求呢?p...

    why_rookie 評論0 收藏0
  • [基礎python]變量和參數

    摘要:每個形參的名稱均可作為過程內的局部變量。實參表示在您調用過程時傳遞給過程形參的值。看官如果硬著頭皮看完這段引文,發現里面有幾個關鍵詞參數變量形參實參。好似全局變量能力很強悍,能夠統帥函數內外。 對于變量和參數,不管是已經敲代碼多年的老鳥,還是剛剛接觸編程的小白,都會有時候清楚,有時候又有點模糊。因為,在實際應用中,它們之間分分離離,比如,敲代碼都知道,x=3中x是變量,它不是參數,但是...

    Freelander 評論0 收藏0
  • [基礎Python]正規地說一句話

    摘要:語句,遍列列表字符串字典集合等迭代器,依次處理迭代器中的每個元素。與配合使用處理在程序運行中出現的異常情況。表示此行為空,不運行任何操作。在迭代器函數內使用,用于返回一個元素。恭請到上瀏覽及時更新的教程零基礎學 小孩子剛剛開始學說話的時候,常常是一個字一個字地開始學,比如學說餃子,對他/她來講,似乎有點難度,大人也聰明,于是就簡化了,用餃餃來代替,其實就是讓孩子學會一個字就能表達。當然...

    Freeman 評論0 收藏0

發表評論

0條評論

DrizzleX

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<