Python生成器

生成器介紹

在函數(shù)內(nèi)部包含yield關(guān)鍵字,那么該函數(shù)執(zhí)行的結(jié)果是生成器培慌,生成器就是迭代器。
生成器的功能:把函數(shù)結(jié)果做成迭代器(以一種優(yōu)雅的方式封裝好iter,next)。提供了一種自己定義迭代器的方式镐牺。
使用生成器創(chuàng)建一個(gè)迭代器:

def a():
    print('a')
    yield 11      # 使用yield,執(zhí)行后返回魁莉,類似于return,但是直接執(zhí)行函數(shù)會(huì)生成一個(gè)迭代器
    print('b')
    yield 22
    print('c')
    yield '33'

g=a()
for i in g:  # i=iter(g) g=next(i)  #這里只執(zhí)行迭代過程睬涧,迭代的內(nèi)容是一個(gè)函數(shù)
    pass

輸出結(jié)果:
a
b
c

此處的i做為迭代器中的一個(gè)元素,在執(zhí)行之后會(huì)將yield的返回值沛厨,賦值給i宙地,打印i就可以得到返回值:

def a():
    print('a')
    yield 11     
    print('b')
    yield 22
    print('c')
    yield '33'

g=a()
for i in g:  # i=iter(g)  next(i) 
    print(i)

執(zhí)行結(jié)果:
a
11
b
22
c
33

生成器作用

使用生成器創(chuàng)建迭代器,在使用大容量列表或者對(duì)大文件進(jìn)行操作的時(shí)候?yàn)榱吮苊鈨?nèi)存被耗盡會(huì)使用迭代器的方式去實(shí)現(xiàn)逆皮。
創(chuàng)建迭代器:

def my_rang(start,stop):
    while True:
        if start == stop:
            raise StopIteration   # 主動(dòng)拋出一個(gè)異常宅粥,結(jié)束迭代器。
        yield start
        start+=1
g=my_rang(1,10)

for i in g:
    print(i)

提示:不要使用控制循環(huán)的方式控制迭代器退出电谣,這樣會(huì)產(chǎn)生迭代器異常秽梅,最好使用主動(dòng)拋出raise StopIteration的方式去終止迭代器。

yield與return的比較

都有返回值的功能剿牺,return只能返回一次值企垦,yield能返回多次值。
yield的功能:

  • 把函數(shù)的結(jié)果做成迭代器(以一種優(yōu)雅的方式封裝好iter,next
  • 函數(shù)暫停與再繼續(xù)運(yùn)行的狀態(tài)是由yield提供的晒来。

生成器與迭代器的應(yīng)用

讀取文件钞诡,模擬Linux 系統(tǒng)中的tail 功能。

import time
def tail(filename):
    with open(filename,'r') as f:
        f.seek(0,2)
        while True:
            line=f.readline()
            if line:
                yield (line)
            else:
                time.sleep(0.3)

for g in tail('a.txt'):
    print(g)

當(dāng)向文件中追加內(nèi)容時(shí)湃崩,會(huì)自動(dòng)顯示追加的新內(nèi)容荧降。
同理,如果實(shí)現(xiàn)管道功能,使用grep類似的功能,只需添加一個(gè)grep 函數(shù)即可:

import time
def tail(filename):
    with open(filename,'r') as f:
        f.seek(0,2)
        while True:
            line=f.readline()
            if line:
                yield (line)
            else:
                time.sleep(0.3)

def grep(patten,lines):
    for line in lines:
        if patten in line:
            print(line,end='')

grep('error',tail('a.txt'))

這樣就避免了占用過大內(nèi)存的情況,內(nèi)存中只保存一行數(shù)據(jù).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市攒读,隨后出現(xiàn)的幾起案子朵诫,更是在濱河造成了極大的恐慌,老刑警劉巖薄扁,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剪返,死亡現(xiàn)場(chǎng)離奇詭異废累,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脱盲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門邑滨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宾毒,你說我怎么就攤上這事驼修。” “怎么了诈铛?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵乙各,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我幢竹,道長(zhǎng)耳峦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任焕毫,我火速辦了婚禮蹲坷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邑飒。我一直安慰自己循签,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布疙咸。 她就那樣靜靜地躺著县匠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撒轮。 梳的紋絲不亂的頭發(fā)上乞旦,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音题山,去河邊找鬼兰粉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛顶瞳,可吹牛的內(nèi)容都是我干的玖姑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼慨菱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼焰络!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抡柿,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤舔琅,失蹤者是張志新(化名)和其女友劉穎等恐,沒想到半個(gè)月后洲劣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體备蚓,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年囱稽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郊尝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡战惊,死狀恐怖流昏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吞获,我是刑警寧澤况凉,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站各拷,受9級(jí)特大地震影響刁绒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烤黍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一知市、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧速蕊,春花似錦嫂丙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至媳叨,卻和暖如春腥光,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背糊秆。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工武福, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痘番。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓捉片,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汞舱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伍纫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 作者:邵正將 來源:PytLab 在python中生成器可以很方便的實(shí)現(xiàn)迭代協(xié)議。生成器通過生成器函數(shù)產(chǎn)生昂芜,生成器...
    PyChina閱讀 1,576評(píng)論 0 6
  • 1.迭代 在理解生成器之前莹规,先理解迭代。 1.1 迭代 如果給定一個(gè)list或tuple泌神,我們可以通過for循環(huán)來...
    XYZeroing閱讀 804評(píng)論 1 3
  • Python列表生成式 列表推導(dǎo)式的一般語(yǔ)法 這種語(yǔ)法等價(jià)于以下代碼 下面舉一些列表推導(dǎo)式的栗子: Python中...
    So_ProbuING閱讀 1,287評(píng)論 0 0
  • 1.什么是生成器 通過列表生成式矾兜,我們可以直接創(chuàng)建一個(gè)列表。但是患久,受到內(nèi)存限制椅寺,列表容量肯定是有限的。而且蒋失,創(chuàng)建一...
    一只寫程序的猿閱讀 944評(píng)論 0 4
  • 本文翻譯自Functional Programming Howto 本文將介紹Python中函數(shù)式編程的特性返帕。在對(duì)...
    大蟒傳奇閱讀 2,623評(píng)論 4 14