python:迭代器

原文地址

顧名思義,就是可以迭代的器(對象)

  • 創個實例
for i in [1,2,3]:
    print(t)

其實其內部就是調用了迭代器

  • dir()方法

dir() 函數不帶參數時,返回當前範圍內的變量、方法和定義的類型列表;帶參數時,返回參數的屬性、方法列表。如果參數包含方法__dir__(),該方法將被調用。如果參數不包含__dir__(),該方法將最大限度地收集參數信息。

簡單說可以通過dir(obj)方法返回其obj的內部方法

print(dir(list))
# ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
  • __iter__
print('__iter__' in dir(list))
# True

list是一個可迭代的數據類型,它之所以是可迭代的,是因爲其內部存在__iter__方法

可迭代協議:內部有__iter__方法的可迭代的

  • __next__

一個實例

l = [1,2,3]
iterator = l.__iter__()
print(iterator.__next__())
print(iterator.__next__())
print(iterator.__next__())
# 1
# 2
# 3
# print(iterator.__next__())  # 上面已經迭代到最後一個元素了,再__next__()就會報錯

迭代器協議:內部有有__iter__和__next__方法的都是迭代器

  • 迭代器的優勢
# rang(int)是一個迭代器
print(range(1000000000000000000))
# range(0, 1000000000000000000)
print(list(range(10000)))
# 嘗試了10的9次方,卡爆了我的內存,不得不強行關機。。。

從容器類型中一個一個的取值,會把所有的值都取到。
節省內存空間
迭代器並不會在內存中再佔用一大塊內存,
而是隨着循環 每次生成一個——隨用隨生成
每次next每次給我一個

  • 小結

    • 可迭代協議:內部有__iter__方法的可迭代的
    • 迭代器協議:內部有有__iter__和__next__方法的都是迭代器
    • 迭代器一定是可迭代的,可迭代的不一定是迭代器
    • 只有 是可迭代對象的時候 才能用for
    • 只有可迭代的纔可以進行for循環,在進行for循環的時候,會去檢查對象有沒有__iter__,沒有會報不可迭代對象,有才執行
    • 迭代器的優勢,隨用隨生成,節省內存空間
  • 參考文獻

    python之路——迭代器和生成器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章