啪啪啪国产一区二区三区_女人体1963视频一区二区_亚洲精品无码久久红颜_先锋av资源网站


學(xué)AI,好工作 就找北大青鳥
關(guān)注小青 聽課做題,輕松學(xué)習(xí)
周一至周日
4000-9696-28

Python中的迭代器與可迭代對象

來源:北大青鳥總部 2023年01月13日 11:01

摘要: Python中的許多結(jié)構(gòu)內(nèi)置支持可迭代協(xié)議,會自動處理StopIteration異常,如for循環(huán)、拆包等。

說到Python編程語言,最令人印象深刻的應(yīng)該就是它的易用性了。為了提供易用性,語言中封裝了大量的常用數(shù)據(jù)結(jié)構(gòu)、算法和類庫,并創(chuàng)建了不少

與其他語言不同的概念。其中,大部分概念都非常容易理解。然而,仍有些概念比較相似,常常使初學(xué)者混淆,比如迭代器和可迭代對象。

有編程經(jīng)驗的開發(fā)者都知道,迭代(或稱循環(huán))是處理大量數(shù)據(jù)時非常常用的手段。


從普通對象到迭代器

查看下面一個常規(guī)的類定義:

class SimpleClass1:

pass

simple1 = SimpleClass1()

如果從simple對象獲取數(shù)據(jù):

next(simple1)

將會報錯“TypeError: 'SimpleClass1' object is not an iterator”,這是因為simple1對象不是一個迭代器。


下面介紹Python中的可迭代協(xié)議。

如果要使一個對象成為一個迭代器,需要:

實現(xiàn)無參數(shù)的“__next__”方法,返回下一個數(shù)據(jù);

當(dāng)沒有下一個數(shù)據(jù)時,拋出一個特殊的異常StopIteration。


那么,重新實現(xiàn)SimpleClass,如下:

class SimpleClass2:

def __init__(self, name):

self.name = name

self.current = 0

def __next__(self):

if self.current >= len(self.name):

raise StopIteration

nextval = self.name[self.current]

self.current += 1

return nextval

simple2 = SimpleClass2('abc')

重新使用next函數(shù)就可以獲取數(shù)據(jù)了:

next(simple2) # 返回a

next(simple2) # 返回b

next(simple2) # 返回c

next(simple2) # 拋出異常 StopIteration

如上所示,迭代器可以成功返回數(shù)據(jù),如預(yù)期那樣。但是每次都使用next函數(shù)獲取數(shù)據(jù)還是比較麻煩,更不用說還要去處理異常。


從迭代器到可迭代對象

如果在開發(fā)中,對象能夠直接支持for循環(huán)來進(jìn)行遍歷,并且自動處理StopIteration異常,那么實際開發(fā)工作將會簡單許多。

于是Python中引入了可迭代對象的概念,可迭代對象就是能夠支持使用iter來獲取迭代器的對象。我們可以在類中實現(xiàn)__iter__方法來支持iter函數(shù):

class SimpleClass3:

def __init__(self, name):

self.name = name

self.current = 0

def __next__(self):

if self.current >= len(self.name):

raise StopIteration

nextval = self.name[self.current]

self.current += 1

return nextval

def __iter__(self):

print('__iter__方法被調(diào)用')

return self

simple3 = SimpleClass3('abc')

使用for循環(huán)打印元素:

for item in simple3:

print(item)

將會順序輸出 a, b, c三個元素,for循環(huán)語句會自動調(diào)用iter獲取此可迭代對象的迭代器,并自動處理異常。


Python可迭代協(xié)議使用實例

以上就是Python中的可迭代協(xié)議。下面使用該協(xié)議仿照系統(tǒng)內(nèi)置range實現(xiàn)一個簡化版本的類SimpleRange,它支持返回從0到n(不包括)的整數(shù)值。

class _SimpleRange:

def __init__(self, n):

self.n = n

self.current = 0

def __iter__(self):

return self

def __next__(self):

"""支持獲取下一個元素"""

if self.current >= self.n:

raise StopIteration # 當(dāng)沒有下一個元素時拋出異常

next_val = self.current # 保存當(dāng)前值以便返回

self.current += 1

return next_val


class SimpleRange:

"""簡化版本的range"""

def __init__(self, n):

"""初始化對象"""

self.n = n

def __iter__(self):

"""支持返回迭代器"""

return _SimpleRange(self.n)


simple_range = SimpleRange(10)

r = range(10)

assert list(simple_range) == list(r)

assert list(simple_range) == list(r) # 該斷言會成功通過

上面的代碼中,_SimpleRange實現(xiàn)了__next__方法,所以其對象是一個迭代器。而SimpleRange實現(xiàn)了_iter__方法,并且在其中返回一個新的_SimpleRange對象。SimpleRange是一個可迭代對象。

需要注意的是,在SimpleRange對象中每次調(diào)用iter都會返回一個全新的迭代器(即_SimpleRange對象),這就是上面代碼中,第二個斷言能夠通過的原因。

下面看第二個例子,定義一個列表如下:

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]

我們知道,lst是可迭代對象,所以可以使用iter函數(shù)獲取其迭代器iter(lst)。而如果將同一個迭代器放入zip函數(shù),可以同時分別從

同一個迭代器獲取數(shù)據(jù),即:

lst_iter = iter(lst)

assert list(zip(lst_iter, lst_iter, lst_iter)) == [(1, 2, 3), (4, 5, 6), (7, 8, 9)]

將上面的代碼組合在一起,配合拆包則可以使用代碼:

list(zip(*[iter(lst)]*3))

將列表 [1, 2, 3, 4, 5, 6, 7, 8, 9],轉(zhuǎn)換為 [(1, 2, 3), (4, 5, 6), (7, 8, 9)]。


特殊的可迭代對象

除了標(biāo)準(zhǔn)的實現(xiàn)可迭代的方法(即實現(xiàn)__iter__方法)外,如果一個類實現(xiàn)了__getitem__方法,并且其索引是從0開始的整數(shù),則

其對象也是可迭代對象。如:

class SimpleClass4:

def __init__(self, n):

self.n = n

def __getitem__(self, idx):

if idx < self.n:

return idx

raise StopIteration


總結(jié)

可迭代對象就是可以用來拿到迭代器的對象,而迭代器可以用來獲取下一個數(shù)據(jù)。

可迭代對象實現(xiàn)了返回迭代器的__iter__方法或者使用從0開始的整數(shù)索引的__getitem__方法;迭代器實現(xiàn)了獲取下一個元素的__next__方法,當(dāng)沒有下一個元素時,迭代器會拋出一個特殊的異常StopIteration。

Python中的許多結(jié)構(gòu)內(nèi)置支持可迭代協(xié)議,會自動處理StopIteration異常,如for循環(huán)、拆包等。

標(biāo)簽: python
熱門班型時間
人工智能就業(yè)班 即將爆滿
AI應(yīng)用線上班 即將爆滿
UI設(shè)計全能班 即將爆滿
數(shù)據(jù)分析綜合班 即將爆滿
軟件開發(fā)全能班 爆滿開班
網(wǎng)絡(luò)安全運(yùn)營班 爆滿開班
報名優(yōu)惠
免費(fèi)試聽
課程資料
官方微信
返回頂部
培訓(xùn)課程 熱門話題 站內(nèi)鏈接
亚洲精品影院| 可以免费看毛片的网站| 99久久精品国产高清一区二区 | 久久精品大片| 欧美电影免费| 国产视频一区在线| 午夜欧美福利| 国产福利免费视频| 99热热久久| 九九九在线视频| 精品毛片视频| 91麻豆国产级在线| 国产伦精品一区二区三区无广告| 九九免费精品视频| 日本免费看视频| 国产一区二区精品| 色综合久久天天综合观看| 国产一区精品| 青青青草视频在线观看| 麻豆系列 在线视频| 精品国产亚洲人成在线| 青青青草影院 | 国产成a人片在线观看视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 亚飞与亚基在线观看| 午夜家庭影院| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲第一视频在线播放| 九九免费精品视频| 在线观看导航| 欧美爱色| 精品久久久久久综合网| 国产精品1024永久免费视频 | 国产91视频网| 久久国产精品只做精品| 亚洲不卡一区二区三区在线 | 国产精品1024永久免费视频| 国产一区二区精品尤物| 午夜欧美福利| 台湾毛片| 国产麻豆精品高清在线播放| 成人免费网站视频ww| 九九干| 成人高清视频免费观看| 国产一区二区高清视频| 国产网站免费视频| 欧美大片一区| 四虎影视精品永久免费网站| 午夜在线亚洲| 精品久久久久久中文字幕一区 | 国产视频一区二区在线观看| 麻豆网站在线免费观看| a级毛片免费观看网站| 国产一区二区精品在线观看| 国产视频一区二区三区四区| 欧美国产日韩精品| 成人免费观看男女羞羞视频| 国产视频久久久久| 可以免费在线看黄的网站| 日本免费看视频| 亚洲精品影院| 国产成人欧美一区二区三区的| 午夜久久网| 欧美激情在线精品video| 久久精品大片| 九九精品影院| 久草免费在线色站| 午夜家庭影院| 国产网站免费在线观看| 国产综合91天堂亚洲国产| 一a一级片| 国产一区二区精品尤物| 久久国产影视免费精品| 99热精品一区| 国产麻豆精品免费密入口| 欧美a免费| 免费毛片播放| 久久国产影视免费精品| 日韩一级黄色片| 韩国三级视频在线观看| 台湾美女古装一级毛片| 国产成人女人在线视频观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 成人高清视频在线观看| 日韩一级黄色| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产国语在线播放视频| 香蕉视频一级| 久久久成人影院| 国产成人精品影视| 美女免费精品高清毛片在线视| 一级女性全黄生活片免费| 免费的黄视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产一区二区高清视频| 久草免费在线色站| 欧美激情一区二区三区在线| 99久久精品国产麻豆| 成人免费高清视频| 精品视频一区二区三区| 免费国产在线观看| 美女免费毛片| 日本特黄特色aaa大片免费| 美女免费毛片| 精品久久久久久中文字幕一区 | 国产一区国产二区国产三区| 九九精品影院| 香蕉视频一级| 沈樵在线观看福利| 中文字幕97| 欧美一区二区三区性| 午夜家庭影院| 夜夜操网| 沈樵在线观看福利| 韩国三级香港三级日本三级la| 999久久久免费精品国产牛牛| 人人干人人草| 精品国产一区二区三区久| 一级女性大黄生活片免费| 欧美a级片视频| 国产成人精品在线| 国产亚洲免费观看| 四虎论坛| 国产一区二区精品在线观看| 久久99这里只有精品国产| 精品国产亚洲一区二区三区| 国产极品白嫩美女在线观看看| a级毛片免费观看网站| 久久精品免视看国产明星| 日韩一级黄色| 久久福利影视| 精品国产一区二区三区国产馆| 成人免费高清视频| 国产极品白嫩美女在线观看看| 亚洲天堂在线播放| 中文字幕Aⅴ资源网| 国产一区二区精品久久91| 天天做人人爱夜夜爽2020| 欧美激情一区二区三区视频高清| 亚洲精品中文字幕久久久久久| 午夜激情视频在线播放| 欧美大片毛片aaa免费看| 中文字幕97| 国产a视频| 久久久成人影院| 国产视频一区二区三区四区| 你懂的福利视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 成人影院一区二区三区| 午夜久久网| 国产精品1024永久免费视频| 国产不卡福利| 你懂的福利视频| 午夜久久网| 欧美激情一区二区三区在线播放| 久久国产精品自由自在| 国产网站免费| 欧美激情一区二区三区在线| 亚洲第一视频在线播放| 天天做日日干| 国产一区二区精品久久| 欧美激情一区二区三区在线| 亚洲精品影院| 日韩一级黄色| 日韩一级精品视频在线观看| 999精品视频在线| 国产精品自拍在线观看| 国产一区精品| 欧美激情在线精品video| 久久国产影院| 欧美一级视| 一级毛片视频在线观看| 99热精品在线| 九九久久99| 国产激情一区二区三区| 九九干| 成人免费网站久久久| 国产视频在线免费观看| 91麻豆国产福利精品| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 韩国三级一区| 黄色免费网站在线| 国产一区国产二区国产三区| 国产一区二区高清视频| 欧美1卡一卡二卡三新区| 色综合久久久久综合体桃花网| 午夜精品国产自在现线拍| a级毛片免费全部播放| 久久精品大片| 久久福利影视| 亚洲第一色在线| 午夜欧美成人久久久久久| 免费国产在线视频| 午夜久久网| 九九干| 国产国语对白一级毛片| 精品视频一区二区三区免费| 你懂的在线观看视频| 国产国产人免费视频成69堂| 91麻豆精品国产综合久久久|