首頁  >  文章  >  後端開發  >  Python 中容易混淆的概念--迭代器與生成器

Python 中容易混淆的概念--迭代器與生成器

零下一度
零下一度原創
2017-07-17 09:58:131291瀏覽

迭代器與生成器

迭代器(iterator)與生成器(generator)是Python 中比較常用又很容易混淆的兩個概念,今天就把它們梳理一遍,並舉一些常用的例子。

for 語句與可迭代物件(iterable object):

for i in [1, 2, 3]:

    print(i)

# obj = {"a": 123, "b": 456}

for k in obj:

    print(k)

#這些可以用在 for 語句進行迴圈的物件就是可迭代物件。除了內建的資料類型(列表、元組、字串、字典等)可以透過 for 語句進行迭代,我們也可以自己建立一個容器,包含一系列元素,可以透過 for 語句依序循環取出每一個元素,這種容器就是迭代器(iterator)。

 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異常,而不是傳回空字串。

例如:

注意,這裡的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 中容易混淆的概念--迭代器與生成器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn