日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

十六、python沉淀之路--迭代器

發(fā)布時間:2024/6/30 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十六、python沉淀之路--迭代器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、迭代器

1、什么是迭代器協(xié)議:對象必須提供一個next方法,執(zhí)行該方法要返回迭代中的下一項,要么就引起一個StopIteration異常,以終止迭代(只能往后走,不能往前走)。

2、可迭代對象:實現(xiàn)了迭代協(xié)議的對象,(如何實現(xiàn):對象內(nèi)部定義了一個__iter__()方法)。

3、協(xié)議是一種約定,可迭代對象實現(xiàn)迭代器協(xié)議,python的內(nèi)部工具(如for循環(huán),sum,min,max函數(shù)等)使用迭代器協(xié)議訪問對象。

4、python種強(qiáng)大的for循環(huán)機(jī)制:

?????? for循環(huán)的本質(zhì):循環(huán)所有對象,全部是使用迭代器協(xié)議。

?????? 正本溯源:
很多人會想,for循環(huán)的本質(zhì)就是遵循迭代器協(xié)議去訪問對象,那么for循環(huán)的對象肯定都是迭代器了啊,沒錯,那既然這樣,for循環(huán)可以遍歷(字符串、列表、元組、字典、集合、文件對象),那這些類型的數(shù)據(jù)肯定都是可以迭代對象的?但是,為什么定義一個列表 li = [1,2,3,4,5]沒有next()的方法呢。

(字符串,列表,元組,字典,集合,文件對象)這些都不是可迭代對象,只不過在for循環(huán)時,調(diào)用他們內(nèi)部的__iter__()方法,把他們變成了可迭代對象。然后for循環(huán)調(diào)用迭代對象的__next__()方法取值,而且for循環(huán)會捕捉StopIteration異常,以終止迭代。

5、for循環(huán)訪問方式:
for循環(huán)本質(zhì)就是遵循了迭代器協(xié)議的訪問方式,先調(diào)用iter_li = li.__iter__()方法,或者直接iter_li=iter(li),然后依次執(zhí)行iter_li.next(),直到for循環(huán)捕捉到stopiteration 終止循環(huán)。for循環(huán)所有對象的本質(zhì)都是一樣的原理。
6、鋪墊

1 x = 'hello' 2 # print(dir(x)) 3 iter_test = x.__iter__() 4 print(iter_test) 5 print(iter_test.__next__()) 6 print(iter_test.__next__()) 7 print(iter_test.__next__()) 8 print(iter_test.__next__()) 9 print(iter_test.__next__()) 1 li = [1,2,3,4] 2 iter_li = li.__iter__() #遵行可迭代協(xié)議,故生成了可迭代對象 3 print(iter_li.__next__()) 4 print(iter_li.__next__())

7、l針對 list? 應(yīng)用? ,以及for 循環(huán)和 while循環(huán)的對比

1 li = [1,2,3,4] 2 for i in li: # 因為li具有__iter__()屬性,所以它具有了__next__()的屬性,可以進(jìn)行迭代 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 4

8、針對 set 應(yīng)用

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 3

9、針對 dict 應(yīng)用

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 c

10、用迭代 打開文件

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 ABCDEFG

11、異常操作: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)?
基于上面列表的三種訪問方式,我們可以知道,它們是通過下標(biāo)的方式遍歷來訪問,序列類型字符串、列表、元組、都有下表,這些都可以用下標(biāo)訪問。但是,非序列類型象字典、集合、文件等,都是沒有下標(biāo)的,而for循環(huán)就是基于迭代器協(xié)議提供了一個同意的可以遍歷所有對象的方法,即遍歷前,先調(diào)用對象的__iter__()方法,
將其轉(zhuǎn)換成一個迭代器,然后哦使用迭代器協(xié)議去實現(xiàn)循環(huán)訪問,這樣所有的對象就都可以通過for 循環(huán)嘞遍歷了。而且我們看到的效果也是這樣的。

轉(zhuǎn)載于:https://www.cnblogs.com/jianguo221/p/8976791.html

總結(jié)

以上是生活随笔為你收集整理的十六、python沉淀之路--迭代器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。