# 迭代器的概念
# 迭代器協議 —— 內部含有__next__和__iter__方法的就是迭代器
# 可迭代協議 —— 只要含有__iter__方法的都是可迭代的
# 迭代器的好處:
# 從容器類型中一個一個的取值,會把全部的值都取到。
# 節省內存空間
#迭代器並不會在內存中再佔用一大塊內存,
# 而是隨着循環 每次生成一個
# 每次next每次給我一個
from collections import Iterable from collections import Iterator print(isinstance([],Iterator)) print(isinstance([],Iterable)) class A: # def __iter__(self):pass def __next__(self):pass a = A() print(isinstance(a, Iterator)) print(isinstance(a, Iterable))
'''當同時擁有__iter__方法和__next__方法 True True ''' '''當只擁有__iter__方法 False True ''' '''當只擁有__next__方法 False False '''
# 迭代器協議和可迭代協議
# 能夠被for循環的都是可迭代的
# 可迭代的內部都有__iter__方法
# 只要是迭代器,必定可迭代
# 可迭代的.__iter__()方法就能夠獲得一個迭代器
# 迭代器中的__next__()方法能夠一個一個的獲取值
print(dir([])) # 告訴我列表擁有的全部方法 ret = set(dir([])) & set(dir({})) & set(dir('')) & set(dir(range(10))) print(ret) # iterable 可迭代對象的方法 # 只要是能被for循環的數據類型 就必定擁有__iter__方法 # 擁有__iter__方法的都是可迭代的 —— 可迭代協議 print('__iter__' in dir(int)) # False print('__iter__' in dir(bool)) # False print('__iter__' in dir(list)) # True print('__iter__' in dir(dict)) # True print('__iter__' in dir(set)) # True print('__iter__' in dir(tuple)) # True print('__iter__' in dir(enumerate([]))) # True print('__iter__' in dir(range(1))) # True print(set(dir([].__iter__())) - set(dir([]))) # 獲取列表迭代器的特有方法 # {'__next__', '__length_hint__', '__setstate__'} # 一個列表執行了__iter__()以後的返回值就是一個迭代器 a = [1, 'a', 'bbb'].__iter__() # 將列表轉換爲可迭代對象 print(a.__length_hint__()) # 獲取元素個數 print(a.__next__()) # 經過__next__就能夠從迭代器中一個一個的取值