python迭代器產生器(一)

來源:互聯網
上載者:User

標籤:效果   速度   注意   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迭代器產生器(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.