迭代器、生成器、裝飾器都有一個「器」,但他們之間沒有什麼關係。學習
迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問完結束。迭代器只能往前不會後退。spa
迭代器有兩個基本的方法:iter() 和 next()。3d
明顯 list 佔用內存空間比 range(0,50)大,只有 是可迭代對象的時候 才能用for,for循環本質就是迭代器code
當咱們遇到一個新的變量,不肯定能不能for循環的時候,就判斷 __iter__ 它是否可迭代對象
一、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__ 方法,可經過 __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