迭代器垒在、生成器和可迭代對象

前言

上次我們簡單分享了迭代器和生成器,本次我們來更加深入的了解相關(guān)概念和使用方法扔亥,希望能對你有所幫助场躯。

自定義迭代器

首先谈为,我們來看看怎么自定義迭代器,自定義迭代器的類需要下面幾個組成踢关。

(1)類中需要定義iter和next魔術(shù)方法伞鲫。
(2)iter魔術(shù)方法返回對象本身。
(3)next方法返回下一個數(shù)據(jù)签舞,如果沒有數(shù)據(jù)秕脓,就報異常StopIteration。

class Test:

    def __init__(self):
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration
        return self.counter


t = Test()
print(next(t))
print(next(t))
print(next(t))

1
2
StopIteration

當然儒搭,我們可以直接使用for循環(huán)來調(diào)用這個迭代器對象吠架。

 for i in t:
     print(i)

1
2

for循環(huán)里面到底是怎么執(zhí)行的了?首先for循環(huán)會先調(diào)用對象的iter魔術(shù)方法搂鲫,返回一個迭代器對象傍药,然后不斷調(diào)用next魔術(shù)方法(異常就停止循環(huán))。

生成器

我們之前學習過魂仍,函數(shù)中有yield關(guān)鍵字拐辽,那這個函數(shù)就是生成器。

def func():
    yield 1
    yield 2


f = func()
print(next(f))
print(next(f))

1
2

其實這個生成器對象內(nèi)部其實是調(diào)用的生成器類generator創(chuàng)建的對象蓄诽,生成器類的內(nèi)部其實也聲明了iter和next魔術(shù)方法薛训。

生成器也完全符合迭代器聲明的規(guī)則,所以仑氛,生成器也是一種特殊的迭代器乙埃。

可迭代對象

最后,我們再聊聊可迭代對象锯岖,我們都知道介袜,列表就是可迭代對象。

l = [1, 2, 3]
for i in l:
    print(i)

字符串出吹,字典等等能夠循環(huán)的遇伞,都是可迭代對象。其定義是捶牢,如果類中有iter魔術(shù)方法鸠珠,并且返回的是迭代器對象,那這個類創(chuàng)建的對象就是可迭代對象秋麸。

class Test:

    def __init__(self):
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration
        return self.counter


class Foo:
    def __iter__(self):
        return Test()


foo = Foo()
for item in foo:
    print(item)

1
2

這里的foo就是可迭代對象渐排,當使用for循環(huán)時,先調(diào)用iter魔術(shù)方法灸蟆,返回一個迭代器對象驯耻,接著就是不斷的調(diào)用next魔術(shù)方法返回值。

我們可以驗證下,列表是可迭代對象可缚,那他就應該有iter方法霎迫,沒有next方法。

l = [1, 2, 3]
print(dir(l))

#['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
print(dir(l.__iter__()))

調(diào)用iter方法后帘靡,就會有iter和next方法了知给。

自定義range函數(shù)

學了這么多,我們來自定義一個range函數(shù)來鞏固下學習內(nèi)容测柠。

class RangeIter:

    def __init__(self, num):
        self.num = num
        self.counter = -1

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == self.num:
            raise StopIteration
        return self.counter


class Xrange:

    def __init__(self, maxnum):
        self.maxnum = maxnum

    def __iter__(self):
        return RangeIter(self.maxnum)

    
for i in Xrange(10):
    print(i)

生成器也可以實現(xiàn)該功能炼鞠。

class Xrange:

    def __init__(self, maxnum):
        self.maxnum = maxnum

    def __iter__(self):
        counter = 0
        while counter < self.maxnum:
            yield counter
            counter += 1

for i in Xrange(5):
    print(i)

今天的分享就到這了缘滥,我們下期再見~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轰胁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子朝扼,更是在濱河造成了極大的恐慌赃阀,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擎颖,死亡現(xiàn)場離奇詭異榛斯,居然都是意外死亡,警方通過查閱死者的電腦和手機搂捧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門驮俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人允跑,你說我怎么就攤上這事王凑。” “怎么了聋丝?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵索烹,是天一觀的道長。 經(jīng)常有香客問我弱睦,道長百姓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任况木,我火速辦了婚禮垒拢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘火惊。我一直安慰自己求类,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布矗晃。 她就那樣靜靜地躺著仑嗅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仓技,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天鸵贬,我揣著相機與錄音,去河邊找鬼脖捻。 笑死阔逼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的地沮。 我是一名探鬼主播嗜浮,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摩疑!你這毒婦竟也來了危融?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雷袋,失蹤者是張志新(化名)和其女友劉穎吉殃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楷怒,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡蛋勺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸠删。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抱完。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刃泡,靈堂內(nèi)的尸體忽然破棺而出巧娱,到底是詐尸還是另有隱情,我是刑警寧澤捅僵,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布家卖,位于F島的核電站,受9級特大地震影響庙楚,放射性物質(zhì)發(fā)生泄漏上荡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一馒闷、第九天 我趴在偏房一處隱蔽的房頂上張望酪捡。 院中可真熱鬧,春花似錦纳账、人聲如沸逛薇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽永罚。三九已至啤呼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呢袱,已是汗流浹背官扣。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羞福,地道東北人惕蹄。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像治专,于是被迫代替她去往敵國和親卖陵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容