迭代器和可迭代物件
阿新 • • 發佈:2020-07-27
一、可迭代物件
定義:可以進行迴圈更新的一個實實在在的值,內部含有__iter__
方法的物件,叫可迭代物件,如,str list dict set range
- 優點:
- 儲存的資料能直觀顯示,比較直觀
- 擁有方法比較多
- 缺點:
- 佔用記憶體
- 不能直接通過for迴圈,不能直接取值,(能取值是應為內部做了轉換)
s1 = 'sadf' print('__iter__' in dir(s1)) # 判斷s1變數是否為可迭代物件 print('__iter__' in dir(range)) # 判斷ranage是否為可迭代物件 # dir() 函式不帶引數時,返回當前範圍內的變數、方法和定義的型別列表;帶引數時,返回引數的屬性、方法列表。如果引數包含方法__dir__(),該方法將被呼叫。如果引數不包含__dir__(),該方法將最大限度地收集引數資訊。
可迭代物件:操作方法比較多,比較直觀,儲存資料相對少的資料集(幾百萬個物件8G記憶體),當你側重於對資料可以靈活處理,並且記憶體空間足夠,將資料集設定為可迭代物件是明確的選擇
二、迭代器
定義:內部含有__iter__
方法並且含有__next__
方法的物件就是迭代器
- 優點:
- 節省記憶體,在記憶體當中只佔一行記憶體
- 惰性機制,next一下,取一個值,絕對不多取
- 缺點:
- 速度慢,時間換空間
- 不走回頭路
# 判斷檔案控制代碼是否為一個迭代器 with open('bb.txt',encoding='utf-8',mode='r') as f: print(('__iter__' in dir(f) and '__next__' in dir(f))) #判斷變數s1是否為迭代器 s1 = 'sadf' print(('__iter__' in dir(s1) and '__next__' in dir(s1)))
l1 = [1, 3, 4, 4, 5]
obj = iter(l1) # 轉換列表為迭代器
print(next(obj)) # 一起取一個值,超出會報錯
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
l1 = [ i for i in range(1,10)] obj = iter(l1) for i in range(3): print(next(obj)) for i in range(4): print(next(obj)) # 不走回頭路,會記住上一次取值的位置,下一次接著取值(只要程式不停止)因此這裡列印1-7
迭代器:是一個非常節約記憶體,可以記錄儲存位置,可以直接通過迴圈next方法取值,但是不直觀,操作方法比較單一,因此當你資料量比較大的時候或者以節約記憶體為首選,將資料設定成可迭代器是不錯的選擇
利用while迴圈模擬for迴圈對可迭代物件進行取值的機制
l1 = [ i for i in range(1,10)]
obj = iter(l1)
while 1:
try:
print(next(obj))
except StopIteration: # 如果出現StopIteration錯誤停止程式
break