迭代器
(iterator)
概述
迭代器是訪問集合內元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素都被訪問一遍後結束。
迭代器不能回退,只能往前進行迭代。這並不是什麼很大的缺點,因為人們幾乎不需要在迭代途中進行回退操作。
迭代器也不是執行緒安全的,在多執行緒環境中對可變集合使用迭代器是乙個危險的操作。但如果小心謹慎,或者乾脆貫徹函式式思想堅持使用不可變的集合,那這也不是什麼大問題。
對於原生支援隨機訪問的資料結構(如
tuple
、list
),迭代器和經典
for迴圈的索引訪問相比並無優勢,反而丟失了索引值(可以使用內建函式
enumerate()
找回這個索引值,這是後話)。但對於無法隨機訪問的資料結構(比如
set)而言,迭代器是唯一的訪問元素的方式。
迭代器的另乙個優點就是它不要求你事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代至某個元素時才計算該元素,而在這之前或之後,元素可以不存在或者被銷毀。這個特點使得它特別適合用於遍歷一些巨大的或是無限的集合,比如幾個
g的檔案,或是斐波那契數列等等。這個特點被稱為延遲計算或惰性求值
(lazy evaluation)
。迭代器更大的功勞是提供了乙個統一的訪問集合的介面。只要是實現了
__iter__()
方法的物件,就可以使用迭代器進行訪問。
使用迭代器
使用內建的工廠函式
iter(iterable)
lst=range(2)
lt=iter(lst)
print(lt)
#列印的是乙個位址it.next()
#列印出來的是 0
from collections import iterator 判斷是否是可迭代物件,即是否可以使用next()方法迭代的
可迭代物件
什麼是可迭代物件? list,dict,set,str,generator(生成器),iterator(迭代器),全部都是可迭代物件(英語叫iterable)。
可迭代物件都可以使用for迴圈遍歷。
製作乙個簡單的迭代器
除了使用iter()
函式將內建的序列物件轉換成相應的迭代器,我們可以自己實現迭代器協議建立迭代器物件,要實現迭代器協議也就是要在類中實現__iter__()
和__next__()
方法。
class container:
def __init__(self,start=0,end=0):
self.start=start
self.end=end
def __iter__(self):
print("我製作這個迭代器!")
return self
def __next__(self):
print("通過 __next__方法進行迭代")
if self.start迭代器就像乙個懶載入的工廠,等到有人需要的時候才給它生成值返回,沒呼叫的時候就處於休眠狀態等待下一次呼叫。
注意:迭代器只能遍歷一次 不能進行二次遍歷
生成器簡介
首先請確信,生成器就是一種迭代器。生成器擁有
next
方法並且行為與迭代器完全相同,這意味著生成器也可以用於
python
的for
迴圈中。另外,對於生成器的特殊語法支援使得編寫乙個生成器比自定義乙個常規的迭代器要簡單不少,所以生成器也是最常用到的特性之一。
如何獲取乙個生成器?首先來看一小段**:
def get_0_1_2():
yield 0
yield 1
yield 2
print(get_0_1_2)
#列印出來的是
我們定義了乙個函式
get_0_1_2
,並且可以檢視到這確實是函式型別。但與一般的函式不同的是,
get_0_1_2
的函式體內使用了關鍵字
yield
,這使得
get_0_1_2
成為了乙個生成器函式。
第一種方式:
將列表的改為(),裡面可以寫推導
生成器只要呼叫next()方法即可得到下乙個值,到最後乙個後異常(stopiteration)退出
用表示式做生成器
例
test=(x for x in rang(10))
next(test)
#或test.__next__()
第二種方式:
通過裴波那切序列講解:將print換成yield,每次生成乙個值
但是呼叫方法時沒有結果
在方法內使用yield做生成器,這樣呼叫此方法時,會得出乙個結果:generator object...
然後也是可以呼叫next()
每到yield時,就會停止,返回當前這個值,可以一次一次next()呼叫,看看執行過程
def fbnq(m):
n,a,b=0,0,1
while n1.語法上和函式類似:生成器函式和常規函式幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值
2.自動實現迭代器協議:對於生成器,python會自動實現迭代器協議,以便應用到迭代背景中(如for迴圈,sum函式)。由於生成器自動實現了迭代器協議,所以,我們可以呼叫它的next方法,並且,在沒有值可以返回的時候,生成器自動產生stopiteration異常
3.狀態掛起:生成器使用yield語句返回乙個值。yield語句掛起該生成器函式的狀態,保留足夠的資訊,以便之後從它離開的地方繼續執行
4.生成器可以被迴圈迭代,直到迴圈結束
生成器 迭代器
最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...
迭代器,生成器
迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...
迭代器 生成器
迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...