經過重複執行的代碼處理類似的數據集的過程,而且本次迭代的處理數據要依賴上一次的結果繼續往下作,上一次產生的結果爲下一次產生結果的初始狀態,若是中途有任何停頓,都不能算是迭代。html
#1) 非迭代例子 loop = 0 while loop < 3: print("Hello world!") loop += 1 #2) 迭代例子 loop = 0 while loop < 3: print(loop) loop += 1
容器僅僅只是用來存放數據的,咱們日常看到的 l = [1,2,3,4]等等,好像咱們能夠直接從列表這個容器中取出元素,但事實上容器並不提供這種能力,而是可迭代對象賦予了容器這種能力。python
實現了__iter__()就行;git
可迭代對象並非指某種具體的數據類型,它是指存儲了元素的一個容器對象。shell
一個可迭代對象是不能獨立進行迭代的,Python中,迭代是經過for ... in來完成的。凡是可迭代對象均可以直接用for… in…循環訪問,這個語句其實作了兩件事:第一件事是調用__iter__()得到一個可迭代器,第二件事是循環調用__next__()。app
常見的可迭代對象包括:a) 集合數據類型,如list、tuple、dict、set、str等;b)生成器(generator)ssh
迭代器能夠看做是一個特殊的對象,每次調用該對象時會返回自身的下一個元素,從實現上來看,一個迭代器對象必須是定義了__iter__()方法和next()方法的對象。函數
系統的 for i in 可迭代器or可迭代對象:... 這個最後有個 StopIteration 異常來檢驗是否結束迭代;oop
>>> a = [1,2,3] >>> b = iter(a) >>> b <list_iterator object at 0x09CF4210> >>> b.__next__() 1 >>> b.__next__() 2 >>> b.__next__() 3 >>> b.__next__() Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> b.__next__() StopIteration
緣由以下:spa
class B(object): def __next__(self): raise StopIteration class A(object): def __iter__(self): pass return B()#return B() #A這個類實現了一個__iter__函數,返回的是B()的實例對象,其中B裏面實現了__next__這個函數。 from collections.abc import * a = A() b = B() print(isinstance(a, Iterable))#由於有__iter__ 因此其是一個可迭代對象Iterable print(isinstance(a, Iterator))#由於沒有__next__ 因此不是一個迭代器Iterator print(isinstance(b, Iterable))#由於沒有__iter__,因此不是一個可迭代對象 print(isinstance(b, Iterator))#由於沒有__iter__ ,因此不是一個迭代器
#output True False False False >>>
這樣B就好了:.net
class B(object): def __next__(self): raise StopIteration def __iter__(self): return None class A(object): def __iter__(self): return B() from collections.abc import * a = A() b = B() print(isinstance(a, Iterable))#使用 能夠檢測一個類是否已經註冊到了 或者實現了 函數, print(isinstance(a, Iterator)) print(isinstance(b, Iterable)) print(isinstance(b, Iterator))isinstance(obj, Iterable)Iterable__iter__()
#output: True False True True
raise:
try: a = input("輸入一個數:") #判斷用戶輸入的是否爲數字 if(not a.isdigit()): raise ValueError("a 必須是數字") except ValueError as e: print("引起異常:",repr(e)) #repr() 函數將對象轉化爲供解釋器讀取的形式。
#任何Python序列均可迭代的緣由是,他們都實現了__getitem__方法。其實,標準的序列也都實現了 __iter__方法。
>>> dir(list) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
原文連接:https://blog.csdn.net/LaoYuanPython/article/details/89609187
參考連接:
https://www.jianshu.com/p/1b0686bc166d
collections.abc 能夠參考這裏:https://docs.python.org/zh-cn/3/library/collections.abc.html
raise: http://c.biancheng.net/view/2360.html
repr: https://www.runoob.com/python/python-func-repr.html
__getitem__(): https://blog.csdn.net/ZT7524/article/details/96479481