標籤:效果 速度 注意 read 迴圈調用 lin Null 字元串 就會 測試
for迴圈可以用於python中任何序列類型,包括序列、元組以及字串。例如:
>>> for x in [1,2,3,4]: print(x * 2,end=‘‘)
...
2468
>>> for x in (1,2,3,4): print(x * 2,end=‘‘)
...
2468
>>> for y in ‘python‘: print(y * 2 ,end=‘ ‘)
...
pp yy tt hh oo nn
實際上,for迴圈甚至比這更為通用:可用於任何可迭代對象。可以認為for是一種迭代工具,還有一些例如:列表解析、in成員關係測試以及map內建函數等。
檔案迭代器
檔案有一個方法,名為__next__,每次調用時,就會返迴文件中的下一行。值得注意得是,到達檔案末尾時,__next__會引發內建的StopIteration異常,而不是返回Null 字元串。
例如:
注意,這裡的print使用end=‘‘來一直添加一個\n,因為行字串已經有一個(如果沒有這點,我們的輸出將變成兩行隔開)、
這樣讀取檔案的好處有三點:
1.寫法簡單
2.運行速度快
3.從記憶體使用量的情況來說也是最好的
相同效果的原始方式,是以for迴圈調用檔案的readlines方法,是將檔案載入到記憶體,做成行字串的列表。
雖然兩種效果相同,但是後者是將檔案一次性載入到記憶體,如果檔案太大,電腦記憶體空間不夠,甚至不能工作。前者迭代器版,對於這種問題就有了免疫功能。(python3通過重寫i/o以支援unicode文本從而使的這一有點不明顯,並更少依賴於系統)
當然也可以用while迴圈來實現,但是相對來說while還是比for慢。
手動迭代:iter和next
為了支援手動迭代代碼,python3中還提供一個內建函數next,他會自動掉用一個對象的__next__方法。給定一個可迭代對象z,調用next(z)等同於z.__next__(),但是前者簡單很多。例如:
從技術的技術的角度將,當for迴圈開始時,會通過它給iter內建函數,一便從可迭代對象獲得一個迭代器,返回的對象含有需要的next方法。
列表以及很多其他的內建對象,不是自身的迭代器,因為他們支援多次開啟迭代器。對這樣的對象,我們必須調用iter來啟動迭代:
從技術上講,for迴圈調用內部等價的I.__next__,而不是這裡使用的next(I)
現在我們展示一下自動和手動迭代之間的對等性:
關於try語句運行一個動作並且捕獲運行過程中發生的異常,我將在後續發表文章,詳細解說。
python迭代器產生器(一)