1. 程式人生 > 實用技巧 >迭代器和可迭代物件

迭代器和可迭代物件

一、可迭代物件

定義:可以進行迴圈更新的一個實實在在的值,內部含有__iter__方法的物件,叫可迭代物件,如,str list dict set range

  • 優點:
    1. 儲存的資料能直觀顯示,比較直觀
    2. 擁有方法比較多
  • 缺點:
    1. 佔用記憶體
    2. 不能直接通過for迴圈,不能直接取值,(能取值是應為內部做了轉換)
s1 = 'sadf'
print('__iter__' in dir(s1))  # 判斷s1變數是否為可迭代物件

print('__iter__' in dir(range)) # 判斷ranage是否為可迭代物件


# dir() 函式不帶引數時,返回當前範圍內的變數、方法和定義的型別列表;帶引數時,返回引數的屬性、方法列表。如果引數包含方法__dir__(),該方法將被呼叫。如果引數不包含__dir__(),該方法將最大限度地收集引數資訊。

可迭代物件:操作方法比較多,比較直觀,儲存資料相對少的資料集(幾百萬個物件8G記憶體),當你側重於對資料可以靈活處理,並且記憶體空間足夠,將資料集設定為可迭代物件是明確的選擇

二、迭代器

定義:內部含有__iter__方法並且含有__next__方法的物件就是迭代器

  • 優點:
    1. 節省記憶體,在記憶體當中只佔一行記憶體
    2. 惰性機制,next一下,取一個值,絕對不多取
  • 缺點:
    1. 速度慢,時間換空間
    2. 不走回頭路
# 判斷檔案控制代碼是否為一個迭代器
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