python三大器之叠代器
阿新 • • 發佈:2017-08-22
ise 在一起 asi pan 可叠代對象 collect 讀取 ons 語句
python中的三大器有叠代器,生成器,裝飾器,本文重點講解下叠代器
叠代器:具備了__next__和__iter__方法的對象
可叠代對象:具備了__iter__方法的對象
1.可叠代對象,可以通過for...in...這類語句叠代讀取一條數據供我們使用的對象稱之為可叠代對象(Iterable),可以通過isinstance()判斷
In [1]: from collections import Iterable In [2]: isinstance({},Iterable) Out[2]: True In [3]: isinstance((),Iterable) Out[3]: True In [4]: isinstance("",Iterable) Out[4]: True In [5]: for item in {}: ...: pass ...: In [6]: for item in "": ...: pass ...: In [7]: for item in (): ...: pass ...:
2.for in的本質
li = [100, 200, 300, 400] # for num in li: # print(num) # 1. 通過調用可叠代對象的__iter__()獲取叠代器 # 2. 對叠代器調用__next__進行叠代操作,# 如果沒有拋出StopIteration異常,表示叠代沒有結束,把獲取到的數據元素放到變量中 # 如果拋出了異常,表示叠代結束,退出執行 # 3. 執行循環體 # 4. 跳轉到第2步執行 iterator = li.__iter__() while True: try: num = iterator.__next__() except StopIteration: break else: print(num)
3.自定義叠代器
class MyIterable(object): def __init__(self): self.container = [] # 定義一個容器 def add(self, item): self.container.append(item) def __iter__(self): return Iterator(self.container) # 返回一個叠代器 class Iterator(object): def __init__(self, container): self.container = container self.i = 0 def __next__(self): if self.i < len(self.container): count = self.i self.i += 1 return self.container[count] else: raise StopIteration def __iter__(self): pass mi = MyIterable() it = mi.__iter__() mi.add(1) mi.add(2) mi.add(3) for item in mi: print(item) from collections import Iterator print(isinstance(it, Iterator))
4.合並叠代器,Python要求定義的叠代的叠代器必須實現__iter__(self),並且返回self。通常,一個可叠代對象對象的叠代器都是固定的,並且,類與類
之間需要距離性,對象之間需要相似性,所以通常可叠代對象和叠代器寫在一起,就是下面的。
class MyIterable(object): def __init__(self): self.container = [] self.i = 0 def add(self, item): self.container.append(item) def __next__(self): if self.i < len(self.container): count = self.i self.i += 1 return self.container[count] else: raise StopIteration def __iter__(self): return self mi = MyIterable() mi.add(1) mi.add(2) mi.add(3) for item in mi: print(item)
python三大器之叠代器