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


學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設計全能班 即將爆滿
數據分析綜合班 即將爆滿
軟件開發全能班 爆滿開班
網絡安全運營班 爆滿開班
報名優惠
免費試聽
課程資料
官方微信
返回頂部
培訓課程 熱門話題 站內鏈接
精品欧美激情精品一区,亚洲自拍的二区三区,亚洲综合精品一区二区,国产伦精品一区二区三区视频免费
日韩中文字幕一区二区三区| k8久久久一区二区三区| 99久久婷婷国产精品综合| 麻豆一区区三区四区产品精品蜜桃| 中文字幕欧美人与畜| 精品免费日韩av| 一区二区三区加勒比av| 国产精品正在播放| 麻豆成人av| 91精品在线观看入口| 亚洲欧美在线高清| 极品少妇一区二区三区精品视频| 3d动漫啪啪精品一区二区免费| 视频一区国产精品| 欧美mv和日韩mv国产网站| 亚洲中国最大av网站| 成人午夜av电影| 五月天久久综合网| 精品成人一区二区三区| 亚洲成av人综合在线观看| 成人av在线一区二区| 亚洲一区二区三区精品视频| 久久这里只有精品6| 日韩在线一区二区三区| 99se婷婷在线视频观看| 欧美综合久久久| 中文字幕一区视频| 国产美女主播视频一区| 欧美日韩免费观看一区| 日韩欧美中文字幕精品| 亚洲成人免费电影| 91麻豆国产精品久久| 欧美在线视频全部完| 18欧美乱大交hd1984| 国产成人av自拍| 亚洲第一导航| 国产性天天综合网| 国内外精品视频| 日韩久久精品一区二区三区| 精品理论电影在线观看 | 九九九九九九精品| 日韩三级精品电影久久久| 亚洲国产精品麻豆| 国产激情美女久久久久久吹潮| 欧美色男人天堂| 一区二区三区蜜桃| 91精品国产一区二区三区动漫| 欧美在线一二三| 亚洲与欧洲av电影| 国产chinese精品一区二区| 欧美久久久久免费| 午夜久久久久久久久| 国产精品一区二区a| 日韩三级免费观看| 久久精品理论片| 深田咏美在线x99av| 中文字幕欧美日韩一区| 岛国精品在线观看| 欧美视频自拍偷拍| 午夜欧美视频在线观看 | 在线免费一区| 亚洲免费在线观看视频| 91蜜桃婷婷狠狠久久综合9色| 欧美日韩精品三区| 视频一区视频二区中文| 欧美极品色图| 国产精品系列在线| zzijzzij亚洲日本少妇熟睡| 欧美日韩国产天堂| 奇米精品一区二区三区在线观看一 | 久久亚洲精品国产精品紫薇| 国产在线精品一区二区| 在线亚洲美日韩| 一区二区三区四区国产精品| 国产免费一区二区| 亚洲精品一区二区三区四区高清| 国产一区二区精品久久| 在线亚洲高清视频| 视频在线观看91| 午夜精品电影在线观看| 亚洲码国产岛国毛片在线| 国产伦精品一区二区三区免费视频| 2021国产精品久久精品| 粉嫩嫩av羞羞动漫久久久| 欧美精品在欧美一区二区少妇| 免费精品99久久国产综合精品| 亚洲五月六月| 亚洲午夜久久久久久久久电影院| 免费国产一区| 亚洲色图在线看| 久久久久久国产精品一区| 中文字幕中文字幕在线一区| 国产经典一区二区三区| 亚洲国产电影在线观看| 999精品视频一区二区三区| 精品国产免费一区二区三区四区 | 蜜桃欧美视频| 亚洲女同女同女同女同女同69| 国产私拍一区| 中文字幕字幕中文在线中不卡视频| 99在线高清视频在线播放| 国产欧美日韩精品一区| 99三级在线| 国产精品日日摸夜夜摸av| 成人黄色在线免费观看| 日本一区二区免费在线观看视频| 91免费国产在线观看| 久久精品网站免费观看| www 成人av com| 国产精品蜜臀在线观看| 黄色99视频| 伊人一区二区三区| 欧美日韩在线不卡一区| 亚洲国产精品久久久久秋霞影院| 日韩国产在线一区| 天堂成人免费av电影一区| 91成人在线精品| 久久黄色级2电影| 91.麻豆视频| www.亚洲色图.com| 国产午夜一区二区三区| 国产美女99p| 一区二区三区四区不卡在线 | 精品乱人伦一区二区三区| 91亚洲永久精品| 国产欧美1区2区3区| 精品不卡在线| 亚洲综合精品久久| 色综合激情久久| 国产一区二区在线影院| 精品美女一区二区| 成人自拍爱视频| 有坂深雪av一区二区精品| 中文字幕一区二区三区5566| 久久er99热精品一区二区| 日韩亚洲欧美综合| eeuss一区二区三区| 日韩理论在线观看| 在线视频不卡一区二区三区| 国产真实乱偷精品视频免| 精品久久人人做人人爽| 狠狠色综合网站久久久久久久| 一级特黄大欧美久久久| 91黄色免费观看| 成人国产精品视频| 国产精品久久久久一区二区三区 | 91观看网站| 一区二区免费看| 欧美色成人综合| 91视频精品在这里| 亚洲另类在线视频| 欧美性做爰猛烈叫床潮| 成人av电影在线网| 亚洲天堂2016| 在线免费不卡电影| av一本久道久久综合久久鬼色| 中文字幕中文字幕中文字幕亚洲无线 | 国产在线视频一区二区三区| 久久久久久一级片| 日本视频一区在线观看| 激情综合五月天| 国产亚洲一区二区三区在线观看 | 69174成人网| 亚洲无人区一区| 7777精品伊人久久久大香线蕉经典版下载| 91丝袜美女网| 五月天一区二区三区| 日韩亚洲欧美一区| 久久久精品国产一区二区三区| 免费看欧美美女黄的网站| 26uuu成人网一区二区三区| 欧洲视频一区二区三区| 国产精品自拍三区| 综合久久给合久久狠狠狠97色 | 精品成人一区二区三区四区| 欧美日韩一区在线播放| 国模冰冰炮一区二区| 国产精品欧美极品| 欧美亚洲动漫制服丝袜| 99久久精品免费看国产一区二区三区| 亚洲国产精品一区二区www在线 | 一区一区视频| 国产精品美日韩| 亚洲一区在线电影| 蜜臀av在线播放一区二区三区| 亚洲成人综合视频| 日本丰满少妇一区二区三区| 91麻豆福利精品推荐| 三级影片在线观看欧美日韩一区二区| 日韩欧美国产高清| 色一情一乱一伦一区二区三区丨| 国产乱国产乱300精品| 亚洲免费毛片网站| 91精品麻豆日日躁夜夜躁| 欧美精彩一区二区三区| 风间由美一区二区av101| 亚洲一区二区三区四区在线观看 | 日韩成人伦理电影在线观看| 久久精品一区二区三区不卡| 在线亚洲高清视频|