十六、python沉淀之路--迭代器
一、迭代器
1、什么是迭代器協(xié)議:對象必須提供一個next方法,執(zhí)行該方法要返回迭代中的下一項,要么就引起一個StopIteration異常,以終止迭代(只能往后走,不能往前走)。
2、可迭代對象:實現(xiàn)了迭代協(xié)議的對象,(如何實現(xiàn):對象內部定義了一個__iter__()方法)。
3、協(xié)議是一種約定,可迭代對象實現(xiàn)迭代器協(xié)議,python的內部工具(如for循環(huán),sum,min,max函數(shù)等)使用迭代器協(xié)議訪問對象。
4、python種強大的for循環(huán)機制:
?????? for循環(huán)的本質:循環(huán)所有對象,全部是使用迭代器協(xié)議。
?????? 正本溯源:
很多人會想,for循環(huán)的本質就是遵循迭代器協(xié)議去訪問對象,那么for循環(huán)的對象肯定都是迭代器了啊,沒錯,那既然這樣,for循環(huán)可以遍歷(字符串、列表、元組、字典、集合、文件對象),那這些類型的數(shù)據(jù)肯定都是可以迭代對象的?但是,為什么定義一個列表 li = [1,2,3,4,5]沒有next()的方法呢。
(字符串,列表,元組,字典,集合,文件對象)這些都不是可迭代對象,只不過在for循環(huán)時,調用他們內部的__iter__()方法,把他們變成了可迭代對象。然后for循環(huán)調用迭代對象的__next__()方法取值,而且for循環(huán)會捕捉StopIteration異常,以終止迭代。
5、for循環(huán)訪問方式:
for循環(huán)本質就是遵循了迭代器協(xié)議的訪問方式,先調用iter_li = li.__iter__()方法,或者直接iter_li=iter(li),然后依次執(zhí)行iter_li.next(),直到for循環(huán)捕捉到stopiteration 終止循環(huán)。for循環(huán)所有對象的本質都是一樣的原理。
6、鋪墊
7、l針對 list? 應用? ,以及for 循環(huán)和 while循環(huán)的對比
1 li = [1,2,3,4] 2 for i in li: # 因為li具有__iter__()屬性,所以它具有了__next__()的屬性,可以進行迭代 3 print(i) #for 循環(huán)具有普遍適用性 4 5 index = 0 6 while index < len(li): # 這種方法只適用于列表、字符串、元素,這些具有可迭代屬性的類型,超出了這些,這種辦法就不能用了 7 print(li[index]) 8 index+=1 1 1 2 2 3 3 4 4 5 1 6 2 7 3 8 48、針對 set 應用
1 se = {1,2,3,4,5,6} 2 for i in se: 3 print(i) 4 se_iter = se.__iter__() 5 print(se_iter.__next__()) 6 print(se_iter.__next__()) 7 print(se_iter.__next__()) 1 1 2 2 3 3 4 4 5 5 6 6 7 1 8 2 9 39、針對 dict 應用
1 di = {'a':1,'b':2,'c':3,'d':4} 2 iter_di = di.__iter__() 3 print(iter_di.__next__()) 4 print(iter_di.__next__()) 5 print(iter_di.__next__()) 1 a 2 b 3 c10、用迭代 打開文件
1 f = open('test.txt','r+',encoding='utf-8') 2 iter_f = f.__iter__() 3 print(iter_f) 4 print(iter_f.__next__(),end='') 5 print(iter_f.__next__(),end='') 6 print(iter_f.__next__(),end=' 1 <_io.TextIOWrapper name='test.txt' mode='r+' encoding='utf-8'> 2 12344556 3 abcdef 4 ABCDEFG11、異常操作:try???? 和?? except
1 li = [1,2,3,4,5] 2 diedai_li = li.__iter__() 3 4 while True: 5 try: 6 print(diedai_li.__next__()) 7 except StopIteration: 8 print('迭代完成,循環(huán)已終止') 9 break 1 1 2 2 3 3 4 4 5 5 6 迭代完成,循環(huán)已終止12、迭代器走向:(只能往后走,不能往前走)。
1 ll = ['爺爺','爸爸','兒子','孫子','重孫'] 2 iter_ll = iter(ll) # ll.__iter__() 等價于 iter(ll) 3 print(iter_ll.__next__()) 4 print(next(iter_ll)) 5 print(iter_ll.__next__()) 6 print(next(iter_ll)) 1 爺爺 2 爸爸 3 兒子 4 孫子?二、為什么要有for循環(huán)?
基于上面列表的三種訪問方式,我們可以知道,它們是通過下標的方式遍歷來訪問,序列類型字符串、列表、元組、都有下表,這些都可以用下標訪問。但是,非序列類型象字典、集合、文件等,都是沒有下標的,而for循環(huán)就是基于迭代器協(xié)議提供了一個同意的可以遍歷所有對象的方法,即遍歷前,先調用對象的__iter__()方法,
將其轉換成一個迭代器,然后哦使用迭代器協(xié)議去實現(xiàn)循環(huán)訪問,這樣所有的對象就都可以通過for 循環(huán)嘞遍歷了。而且我們看到的效果也是這樣的。
轉載于:https://www.cnblogs.com/jianguo221/p/8976791.html
總結
以上是生活随笔為你收集整理的十六、python沉淀之路--迭代器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初学区块链之概述
- 下一篇: python中的functools模块