【2017-09-20】迭代器與生成器(一)

迭代器(iterator)與生成器(generator)

  • 迭代器
    ??迭代器:它是一個(gè)帶狀態(tài)的對(duì)象碴倾,調(diào)用next()方法的時(shí)候返回容器中的下一個(gè)值从铲,任何實(shí)現(xiàn)了iternext()(python2中實(shí)現(xiàn)next())方法的對(duì)象都是迭代器膘侮,iter返回迭代器自身帆离,next返回容器中的下一個(gè)值渗蟹,如果容器中沒(méi)有更多元素了贮尉,則拋出StopIteration異常拌滋。
    ?? 容器:把多個(gè)元素組織在一起的數(shù)據(jù)結(jié)構(gòu),容器中的元素可以逐個(gè)地迭代獲取猜谚,可以用in, not in關(guān)鍵字判斷元素是否包含在容器中败砂。通常這些數(shù)據(jù)結(jié)構(gòu)直接把所有元素存放在內(nèi)存中。
    ?? 可迭代對(duì)象(iterable):但凡是可以返回一個(gè)迭代器的對(duì)象都可稱(chēng)之為可迭代對(duì)象魏铅。例如內(nèi)置的list昌犹、dict、set等數(shù)據(jù)結(jié)構(gòu)屬于可迭代對(duì)象沦零。
    ?? 實(shí)現(xiàn)一個(gè)迭代器的方法
    • 為容器對(duì)象添加 iter() 和 next() 方法(Python 2.7 中是 next())祭隔;iter() 返回迭代器對(duì)象本身 self,next() 則返回每次調(diào)用 next() 或迭代時(shí)的元素路操;
    • 內(nèi)置函數(shù) iter() 將可迭代對(duì)象轉(zhuǎn)化為迭代器
    • 生成器(generator)疾渴。特殊的迭代器,生成器通過(guò) yield 語(yǔ)句(即通過(guò) yield 語(yǔ)句將普通函數(shù)變成生成器)快速生成迭代器屯仗,省略了復(fù)雜的 iter() & next() 方式搞坝。
#簡(jiǎn)單示例
>>> list1=[1,2,3,4]
>>> list_iterator=iter(list1)
>>> list1
[1, 2, 3, 4]
>>> list_iterator
<list_iterator object at 0x0227B7F0>
>>> next(list_iterator)
1
>>> next(list_iterator)
2
>>> next(list_iterator)
3
>>> next(list_iterator)
4
>>> next(list_iterator)
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    next(list_iterator)
StopIteration
>>> 

示例2:自定義迭代器:實(shí)現(xiàn)斐波那契數(shù)列
在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞歸的方法定義:F(0)=0魁袜,F(xiàn)(1)=1, F(n)=F(n-1)+F(n-2)(n>=2桩撮,n∈N*)

>>> from itertools import islice
>>> class Fibonacci:
    def __init__(self):
        self.f0=0
        self.f1=1
    def __iter__(self):
        return self
    def __next__(self):
        value=self.f1
        self.f1+=self.f0
        self.f0=value
        return value

    
>>> f = Fibonacci()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> 

示例3:用生成器的方式實(shí)現(xiàn)斐波那契數(shù)列

>>> def Fibonacci():
    f0,f1=0,1
    while True:
        yield f1
        f0,f1=f1,f0+f1
>>> f = Fibonacci()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> 

??迭代器不會(huì)預(yù)先將所有元素加載在內(nèi)存中,只有當(dāng)它被調(diào)用時(shí)峰弹,才會(huì)真正返回值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末店量,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鞠呈,更是在濱河造成了極大的恐慌融师,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚁吝,死亡現(xiàn)場(chǎng)離奇詭異旱爆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)窘茁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)怀伦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人山林,你說(shuō)我怎么就攤上這事房待。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵吴攒,是天一觀(guān)的道長(zhǎng)张抄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)洼怔,這世上最難降的妖魔是什么署惯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮镣隶,結(jié)果婚禮上极谊,老公的妹妹穿的比我還像新娘。我一直安慰自己安岂,他們只是感情好轻猖,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著域那,像睡著了一般咙边。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上次员,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天败许,我揣著相機(jī)與錄音,去河邊找鬼淑蔚。 笑死市殷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刹衫。 我是一名探鬼主播醋寝,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼带迟!你這毒婦竟也來(lái)了音羞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仓犬,失蹤者是張志新(化名)和其女友劉穎黄选,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體婶肩,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年貌夕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了律歼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啡专,死狀恐怖险毁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤畔况,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布鲸鹦,位于F島的核電站,受9級(jí)特大地震影響跷跪,放射性物質(zhì)發(fā)生泄漏馋嗜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一吵瞻、第九天 我趴在偏房一處隱蔽的房頂上張望葛菇。 院中可真熱鬧,春花似錦橡羞、人聲如沸眯停。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)莺债。三九已至,卻和暖如春签夭,著一層夾襖步出監(jiān)牢的瞬間齐邦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工覆致, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侄旬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓煌妈,卻偏偏與公主長(zhǎng)得像儡羔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子璧诵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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