Fluent Python筆記--可迭代對象磷蜀,迭代器與生成器

當解釋器想要迭代訪問一個對象的時候丁侄,會調(diào)用iter(x)惹苗。

  1. iter方法會檢查對象是否實現(xiàn)了__iter__方法失尖,如果實現(xiàn)了善榛,就調(diào)用它返回一個迭代器戴而。
  2. 如果沒有實現(xiàn)__iter__砾肺,則去嘗試調(diào)用__getitem__方法挽霉,解釋器創(chuàng)建一個迭代器,按下表從0開始依次獲取元素变汪。
  3. 如果上面兩個方法都沒有實現(xiàn)侠坎,則拋出TypeError。錯誤信息為:"XXX object is not iterable"裙盾。

需要說明的一點是实胸,在Python 2.X的環(huán)境下,常常有range()xrange()兩種方式來創(chuàng)建一個可迭代對象(在Python 3.X中統(tǒng)一使用range()闷煤,效果和Python 2.X中的xrange()一致)童芹。兩者的區(qū)別在于前者返回的是一個計算好的列表,而后者返回的是一個惰性可迭代對象鲤拿。列表并不是迭代器假褪。

>>> a = range(7)
>>> b = xrange(7)
>>> c = (x for x in range(7))
>>> next(a)
TypeError: list object is not an iterator.
>>> next(b)
TypeError: xrange object is not an iterator.
>>> next(c)
0

那么,迭代器和可迭代對象又有什么區(qū)別呢近顷?rangexrange對象都可以供多次迭代訪問生音,而迭代器(上文中的c對象)僅可供一次迭代訪問:從下表0開始到StopIteration
使用 iter 內(nèi)置函數(shù)可以從可迭代對象獲取迭代器的對象窒升。如果對象實現(xiàn)了能返回迭代器的 __iter__方法缀遍,那么對象就是可迭代的。序列都可以迭代饱须;實現(xiàn)了 __getitem__ 方法域醇,而且其參數(shù)是從零開始的索引,這種對象也可以迭代。

最后用一個自定義的等差數(shù)列來說明可迭代對象的實現(xiàn):

class ArithmeticProgression:
    def __init__(self, begin, step, end=None): 
        self.begin = begin
        self.step = step
        self.end = end # None -> 無窮數(shù)列

    def __iter__(self):
        result = type(self.begin + self.step)(self.begin) 
        forever = self.end is None 
        index = 0
        while forever or result < self.end: 
            yield result 
            index += 1
            result = self.begin + self.step * index 

# 也可以用下面方法來實現(xiàn)
def aritprog_gen(begin, step, end=None):
    result = type(begin + step)(begin)
    forever = end is None
    index = 0
    while forever or result < end:
        yield result
        index += 1
        result = begin + step * index

# 或者借助itertools來實現(xiàn)
def aritprog_gen(begin, step, end=None):
    import itertools
    first = type(begin + step)(begin)
    ap_gen = itertools.count(first, step)
    if end is not None:
        ap_gen = itertools.takewhile(lambda n: n < end, ap_gen)
    return ap_gen
?著作權(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)容

  • 迭代器(Iterable) 簡單來說劲室,迭代器對象(my_list)可以讓以下代碼正常工作: 如果對象實現(xiàn)了__it...
    SOLAREST閱讀 549評論 0 1
  • Q:我會因為什么事情而持續(xù)高興一整天伦仍? A:想不出。 我撿到了15塊錢 并因此而特別高興 …… 一塊棉花糖 會讓我...
    自說自話自然人閱讀 208評論 0 0
  • 有著《泰坦尼克號》的續(xù)集很洋、肉絲和杰克上了救生艇之后的生活充蓝、、喉磁、的之說谓苟,同時抱著對小李子和凱特的至今為止的二度合作的...
    愛吃魚的短尾樹袋鼠閱讀 332評論 0 1
  • 正在教室里上課的我,不想聽老師講解那“圣人之為國也协怒,壹賞涝焙,壹刑,壹教”孕暇,便望向窗外明媚的陽光仑撞,突然想起了海子的那一...
    VAN_Z閱讀 132評論 0 1