迭代器

 
# 迭代器的概念
# 迭代器協議 —— 內部含有__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__就能夠從迭代器中一個一個的取值
相關文章
相關標籤/搜索