1.迭代和可迭代協議 1)什麼叫迭代 for i in [1,2,3,4]: print(i) 結果: 1 2 3 4 for i in 1234 print(i) 結果: Traceback (most recent call last): File "test.py", line 4, in <module> for i in 1234: TypeError: 'int' object is not iterable 錯誤說,咱們的1234不可迭代。上面的卻能夠。 那麼大膽推測,若是能夠迭代,就應該能夠被for循環。 咱們知道,字符串、列表、元祖、集合、字典均可以for循環 說明他們都是可迭代的。 那麼正確的路子應該是什麼樣的呢,總不能憑空想象。 from collections import Iterable s = '1234' l = [1,2,3,4] t = (1,2,3,4) d = {1:2,3:4} s = {1,2,3,4} print(isinstance(a,Iterable))#Ture print(isinstance(l,Iterable))#Ture print(isinstance(t,Iterable))#Ture print(isinstance(d,Iterable))#Ture print(isinstance(s,Iterable))#Ture 綜上:能夠將某個數據集內的數據「一個挨一個的取出來」,就叫作迭代。 2)可迭代協議 能夠被迭代知足的要求就叫作可迭代協議。 可迭代協議;就是內部實現了 __iter__() 方法 驗證: print(dir([1,2])) print(dir((1,2))) print(dir({1:2})) print(dir({1,2})) 總結: 能夠被for循環的都是可迭代的,想要可迭代,內部必須有一個 __iter__() 方法。 接着分析,這個 __iter__()作了什麼事情? print([1,2].__iter__()) 結果 <list_iterator object at 0x1024784a8> 這裏的iterator就是迭代器。 2.迭代器 可迭代後又一難題出現了,什麼叫「迭代器」? ''' dir([1,2].__iter__())是列表迭代器中實現的全部方法, dir([1,2])是列表中實現的全部方法,都是以列表的形式返 回給咱們的,爲了看的更清楚,咱們分別把他們轉換成集合, 而後取差集。 ''' #print(dir([1,2].__iter__())) #print(dir([1,2])) print(set(dir([1,2].__iter__()))-set(dir([1,2]))) 結果: {'__length_hint__', '__next__', '__setstate__'} 咱們看到在列表迭代器中多了三個方法,那麼這三個方法都是 幹什麼的呢? iter_l = [1,2,3,4,5,6].__iter__()#列表迭代器 #獲取迭代器中元素的長度 print(iter_l.__length_hint__()) #根據索引值指定從哪裏開始迭代 print('*',iter_l.__setstate__(4)) #一個一個的取值 print('**',iter_l.__next__()) print('***',iter_l.__next__()) 結果: 6 * None ** 5 *** 6 這三個方法中,可以一個一個取值的方法就是 __next__() 在for循環中,就是在內部調用了 __next__() 方法才能取到 一個一個的值。 例子: l = [1,2,3] l_iter = l.__iter__() item = l_iter.__next__() print(item)#1 item = l_iter.__next__() print(item)#2 item = l_iter.__next__() print(item)#3 item = l_iter.__next__() print(item)#StopIteration 注意: 若是咱們一直取,直到next取到迭代器裏已經沒有元素了, 就會拋出一個StopIteration異常,告訴咱們,列表中已經 沒有有效元素了。 這個時候,咱們就要使用異常處理機制來把這個異常處理掉。 例子: lis = ['1', '2', '3'] it = lis.__iter__() while 1: try: res = it.__next__() print(res) except StopIteration: break 結果: 1 2 3 注: 迭代器遵循迭代器協議:必須擁有 __iter__()方法和__next__()方法。 # 迭代器的特色: # 1. 節省內存 # 2. 惰性機制 # 3. 只能往前拿. 不能反着拿 3.判斷對象是迭代器仍是可迭代對象 例子: from collections import Iterator from collections import Iterable print(isinstance(range(10), Iterator))#False print(isinstance(range(10), Iterable))#Ture >>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False >>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False