精品欧美激情精品一区,亚洲自拍的二区三区,亚洲综合精品一区二区,国产伦精品一区二区三区视频免费


學AI,好工作 就找北大青鳥
關注小青 聽課做題,輕松學習
周一至周日
4000-9696-28

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

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

摘要: Python中的許多結構內置支持可迭代協議,會自動處理StopIteration異常,如for循環、拆包等。

說到Python編程語言,最令人印象深刻的應該就是它的易用性了。為了提供易用性,語言中封裝了大量的常用數據結構、算法和類庫,并創建了不少

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

有編程經驗的開發者都知道,迭代(或稱循環)是處理大量數據時非常常用的手段。


從普通對象到迭代器

查看下面一個常規的類定義:

class SimpleClass1:

pass

simple1 = SimpleClass1()

如果從simple對象獲取數據:

next(simple1)

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


下面介紹Python中的可迭代協議。

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

實現無參數的“__next__”方法,返回下一個數據;

當沒有下一個數據時,拋出一個特殊的異常StopIteration。


那么,重新實現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函數就可以獲取數據了:

next(simple2) # 返回a

next(simple2) # 返回b

next(simple2) # 返回c

next(simple2) # 拋出異常 StopIteration

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


從迭代器到可迭代對象

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

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

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__方法被調用')

return self

simple3 = SimpleClass3('abc')

使用for循環打印元素:

for item in simple3:

print(item)

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


Python可迭代協議使用實例

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

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 # 當沒有下一個元素時拋出異常

next_val = self.current # 保存當前值以便返回

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實現了__next__方法,所以其對象是一個迭代器。而SimpleRange實現了_iter__方法,并且在其中返回一個新的_SimpleRange對象。SimpleRange是一個可迭代對象。

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

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

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

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

同一個迭代器獲取數據,即:

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],轉換為 [(1, 2, 3), (4, 5, 6), (7, 8, 9)]。


特殊的可迭代對象

除了標準的實現可迭代的方法(即實現__iter__方法)外,如果一個類實現了__getitem__方法,并且其索引是從0開始的整數,則

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

class SimpleClass4:

def __init__(self, n):

self.n = n

def __getitem__(self, idx):

if idx < self.n:

return idx

raise StopIteration


總結

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

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

Python中的許多結構內置支持可迭代協議,會自動處理StopIteration異常,如for循環、拆包等。

標簽: python
熱門班型時間
人工智能就業班 即將爆滿
AI應用線上班 即將爆滿
UI設計全能班 即將爆滿
數據分析綜合班 即將爆滿
軟件開發全能班 爆滿開班
網絡安全運營班 爆滿開班
報名優惠
免費試聽
課程資料
官方微信
返回頂部
培訓課程 熱門話題 站內鏈接
精品欧美激情精品一区,亚洲自拍的二区三区,亚洲综合精品一区二区,国产伦精品一区二区三区视频免费
一色桃子久久精品亚洲| 国产精品一区二区在线播放| 国产九色精品成人porny| 91在线国内视频| 日本一区二区三区免费看| 欧美日韩久久久一区| 国产亚洲精品资源在线26u| 亚洲午夜一区二区| 日韩毛片高清在线播放| 中文字幕在线观看不卡视频| 日韩av网站免费在线| www.66久久| 亚洲看片网站| 精品sm在线观看| 婷婷综合在线观看| 99国产精品久久久久久久久久久| 麻豆av福利av久久av| 9191成人精品久久| 亚洲视频每日更新| 国产一区激情在线| 蜜桃91精品入口| 91精品国产综合久久久蜜臀粉嫩 | 久草精品在线观看| 懂色av一区二区三区在线播放| 正在播放亚洲| 日本一区二区成人| 久久精品免费看| 国产免费高清一区| 欧美日韩精品系列| 亚洲乱码国产乱码精品精小说| 国产精品影视天天线| 欧美日韩电影一区二区| 日韩三级.com| 午夜久久电影网| 99re视频在线播放| 欧美三级在线视频| 亚洲欧美视频在线观看| 成人一区二区三区| 一区二区成人国产精品 | 一本到一区二区三区| 国产欧美视频在线观看| 久久 天天综合| 欧美日韩精品免费观看| 精品国产一区二区亚洲人成毛片 | 色综合视频一区二区三区高清| 国产日韩欧美精品在线| 激情图片小说一区| 日韩不卡av| 欧美国产一区二区| 国产成人综合亚洲网站| 亚洲在线不卡| 国产精品激情偷乱一区二区∴| 国产精品一区专区| 亚洲欧美日韩精品久久久| 国产人久久人人人人爽| 国产老女人精品毛片久久| 亚洲欧美国产一区二区| 国产精品乱人伦一区二区| 国产成人av一区二区| 影音欧美亚洲| 最新欧美精品一区二区三区| av一区二区三区黑人| 欧美美女直播网站| 日韩制服丝袜av| 欧美日韩精品免费观看视一区二区| 久久久精品影视| 国产剧情一区在线| 色拍拍在线精品视频8848| 亚洲精品视频在线观看免费| 99精品国产一区二区| 日韩网站在线看片你懂的| 免费观看日韩av| 欧美激情专区| 国产精品久久网站| 91丨porny丨蝌蚪视频| 91精品国产综合久久福利软件| 日韩成人午夜电影| 欧美一区三区二区在线观看| 国产精品久久久久四虎| 91观看网站| 亚洲精品一区二区三区在线观看| 国产在线观看免费一区| 在线视频一区二区三区| 亚洲va国产va欧美va观看| 免费久久99精品国产自| 国产精品免费视频网站| av色综合网| 久久综合久久综合久久| 成人免费毛片高清视频| 51久久夜色精品国产麻豆| 久草在线在线精品观看| 91福利精品第一导航| 日日骚欧美日韩| 亚州欧美一区三区三区在线| 一区二区三区91| 麻豆av一区二区三区| 国产精品电影一区二区三区| 国产成人精品一区二区三区福利| 久久网站最新地址| 91在线观看视频| 久久亚洲捆绑美女| 99re亚洲国产精品| 久久久综合网站| 91看片淫黄大片一级在线观看| 欧美精品一区二| 91亚洲精华国产精华精华液| 精品播放一区二区| 91丨九色porny丨蝌蚪| 久久先锋影音av| 99精彩视频| 国产精品乱子久久久久| 黑人中文字幕一区二区三区| 国产精品激情偷乱一区二区∴| 国产成人av一区二区三区| 国产精品美日韩| 精品日韩欧美| 一区二区三区在线看| 五月天婷亚洲天综合网鲁鲁鲁| 亚洲不卡av一区二区三区| 中文字幕不卡每日更新1区2区| 免费成人av资源网| 欧美日韩视频不卡| 国产福利一区二区| 欧美大片顶级少妇| 91精品国产91久久久久青草| 国产区在线观看成人精品| 国内视频一区| 一区二区三区鲁丝不卡| 一级日韩一区在线观看| 美女被吸乳得到大胸91| 欧美乱熟臀69xxxxxx| 成人午夜视频在线| 国产嫩草影院久久久久| 久久久久久久久四区三区| 亚洲一区二区视频在线观看| 色综合中文字幕| 国内成+人亚洲+欧美+综合在线| 日韩一二三四区| av噜噜色噜噜久久| 亚洲欧美日韩中文播放| 在线观看一区二区三区三州| 精品一区二区三区在线观看 | 日韩精品欧美在线| 奇米影视7777精品一区二区| 欧美精品一卡二卡| 99re亚洲国产精品| 亚洲图片你懂的| 一区二区不卡在线| 国产馆精品极品| 国产精品视频在线看| 日韩在线电影一区| 久久精品72免费观看| 精品国产乱码久久久久久牛牛 | 国产乱子轮精品视频| 久久综合久久久久88| 久久久久一区二区| 秋霞午夜av一区二区三区| 日韩一区二区三区观看| 国产欧美日韩一区二区三区| 亚洲国产综合在线| 欧美乱熟臀69xxxxxx| 成人av片网址| 亚洲3atv精品一区二区三区| 欧美精选午夜久久久乱码6080| 91美女蜜桃在线| 亚洲一区在线看| 在线播放91灌醉迷j高跟美女| 99视频免费观看| 亚洲成人av一区二区| 欧美一区二区三区免费在线看| 国产精品9999久久久久仙踪林 | 日韩亚洲不卡在线| 狠狠狠色丁香婷婷综合久久五月| 国产亚洲婷婷免费| 色99中文字幕| 丁香六月久久综合狠狠色| 综合欧美亚洲日本| 欧美日韩情趣电影| 岛国视频一区| 美女国产一区二区| 欧美经典三级视频一区二区三区| 亚洲欧美日韩综合一区| 风间由美一区二区三区在线观看 | 天天色天天操综合| 精品国产1区二区| 亚洲国产日韩欧美| 成人精品国产福利| 亚洲一区二区成人在线观看| 欧美一区二区日韩| 青青成人在线| 成人动漫一区二区在线| 亚洲一卡二卡三卡四卡| 日韩欧美色综合| 日韩精品伦理第一区| 成人黄色一级视频| 午夜视频一区二区三区| 久久伊99综合婷婷久久伊| 中国人体摄影一区二区三区| 18成人免费观看网站下载| 日韩成人av影视|