python迭代器和生成器

2021-10-01 16:31:21 字數 1047 閱讀 2240

迭代器

迭代器是乙個實現了迭代器協議的物件,python中的迭代器協議就是有next方法的物件會前進到下一結果,而在一系列結果的末尾是,則會引發stopiteration。

在for迴圈中,python將自動呼叫工廠函式iter()獲得迭代器,自動呼叫next()獲取元素,還完成了檢查stopiteration異常的工作。常用的幾個內建資料結構tuple、list、set、dict都支援迭代器,字串也可以使用迭代操作。你也可以自己實現乙個迭代器,如上所述,只需要在類的__iter__方法中返回乙個物件,這個物件擁有乙個next()方法,這個方法能在恰當的時候丟擲stopiteration異常即可。但是需要自己實現迭代器的時候不多,即使需要,使用生成器會更輕鬆.使用迭代器乙個顯而易見的好處就是:每次只從物件中讀取一條資料,不會造成記憶體的過大開銷.

生成器

生成器的編寫方法和函式定義類似,只是在return的地方改為yield。

生成器中可以有多個yield。當生成器遇到乙個yield時,會暫停執行生成器,返回yield後面的值。當再次呼叫生成器的時候,會從剛才暫停的地方繼續執行,直到下乙個yield。

生成器自身又構成乙個迭代器,每次迭代時使用乙個yield返回的值。

需要注意的是,生成器中不需要return語句,不需要指定返回值,在生成器中已經存在預設的返回語句

生成器表示式

(i for i in range(5))// 返回迭代器at 0x7ff3e8f0d960>

列表解析,返回list

[i for i in// 返回list[0, 1, 2, 3, 4]

在這裡存在乙個問題,那就是range(5)會返回乙個長度為5的資料,如果是range(1000)那麼就會占用乙個1000大小的陣列空間;如果我們採用`生成器`,在需要的時候產生乙個數字,那麼空間的占用情況就會降低,這裡我們可以使用xrange()函式來實現。

所以xrange做迴圈的效能比range好,尤其是返回很大的時候,盡量用xrange吧,除非你是要返回乙個列表。

Python迭代器和生成器

先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...

Python迭代器和生成器

迭代器是訪問集合元素的一種方法 是可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問 他有兩個基本的方法,iter 和next 字串,列表或遠足物件都可以用於建立迭代器 list1 1,2,3,4 it1 iter list1 建立迭代器物件 print next ...

python 迭代器和生成器

迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退,不過這也沒什麼,因為人們很少在迭代途中往後退。另外,迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可...