python-19-迭代器是個什麼東西?

前言

迭代器、生成器、裝飾器都有一個「器」,但他們之間沒有什麼關係。學習

迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問完結束。迭代器只能往前不會後退。spa

迭代器有兩個基本的方法:iter() 和 next()3d

1、迭代器優勢

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

 明顯 list 佔用內存空間比 range(0,50)大,只有 是可迭代對象的時候 才能用for,for循環本質就是迭代器code

當咱們遇到一個新的變量,不肯定能不能for循環的時候,就判斷 __iter__ 它是否可迭代對象

 2、迭代器介紹

一、dir 查看可調用方法:print(dir(list))blog

能夠看到:int、bool 數據類型是沒有 iter() 方法的。內存

print(dir(list))                    # 查看某數據類型擁有的全部可調用方法
print(dir([]))                      # [] == list
print('__iter__' in dir(int))
print('__iter__' in dir(bool))
print('__iter__' in dir(list))
print('__iter__' in dir(dict))
print('__iter__' in dir(set))
print('__iter__' in dir(tuple))
print('__iter__' in dir(enumerate([])))
print('__iter__' in dir(range(1)))

 二、結論:it

  • 只要含有 __iter__ 方法的都是可迭代的
  • 發現只要是能被 for 循環的數據類型,就必定擁有 __iter__ 方法
  • 一個數據類型執行了 __iter__() 方法以後的返回值就是一個迭代器

三、擁有 __iter__ 方法,可經過 __next__ 方法從迭代器中一個一個的取值,但不可逆。io

# 經過 next 就能夠從迭代器中一個一個的取值
ls = [1, 2, 3]
res = ls.__iter__()          # 一個一個取值,不可逆
print(res.__next__())       # 1
print(res.__next__())       # 2
print(res.__next__())       # 3
print(res.__next__())       # list 只有 3個元素,因此這裏會報錯

 四、實例驗證迭代器是否是必定含有這兩個方法:iter() 和 next()for循環

圖一:兩個方法存在

圖二:註釋 next() 方法,不是迭代器,但可迭代

圖三:註釋 iter() 方法,都不是迭代器,或可迭代

from collections import Iterable, Iterator
class A:
    ''' # 內部含有__next__和__iter__方法的就是迭代器,缺一都不行 '''
    def __iter__(self):pass
    def __next__(self):pass

res = A()
print(isinstance(res, Iterator))      # 迭代器
print(isinstance(res, Iterable))      # 可迭代

 

 

迭代器是可記住遍歷位置的對象,你要多少就給你多少,美滋滋!歡迎來QQ交流羣一塊兒學習:482713805

相關文章
相關標籤/搜索