生成器

生成器的產(chǎn)生

?????對(duì)于for龙屉,range钻哩,Python內(nèi)部已經(jīng)把它封裝成了一個(gè)迭代器相速,那么如果我們想自定義一個(gè)迭代器的話碟渺,應(yīng)該怎么辦鲜锚?這時(shí)候就應(yīng)運(yùn)而生了生成器突诬。一個(gè)生成器必定是一個(gè)迭代器

創(chuàng)建生成器的兩種方式

1.生成器函數(shù)
def generator():
    print("1")
    yield "first"
    print("2")
    yield "second"
    print("3")
    yield "third"


if __name__ == '__main__':
    g = generator()
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
生成器.png

?????首先定義一個(gè)生成器函數(shù)需要yield關(guān)鍵字,它的作用和return很相似芜繁,但是return是結(jié)束這個(gè)函數(shù)旺隙,yield只表示此次next取值結(jié)束。
以上函數(shù)執(zhí)行流程為:
1.調(diào)用generator()函數(shù)骏令,返回一個(gè)生成器蔬捷。
2.調(diào)用第一個(gè)__next__(),這時(shí)進(jìn)入到generator()函數(shù)中榔袋,打印1周拐,并遇見第一個(gè)yield并返回”first“。
3.調(diào)用第二個(gè)__next__()凰兑,這時(shí)進(jìn)入到generator()函數(shù)中上次執(zhí)行到的yield的地方妥粟,打印2,并遇見第二個(gè)yield并返回”second“吏够。
4.第三次同理勾给。
5.如果在繼續(xù)調(diào)用__next__(),將會(huì)拋出StopIteration锅知。

yield from

def generator():
    ls = [1,2,3,4]
    yield from ls

?????yield from后跟一個(gè)可迭代對(duì)象播急,等價(jià)與依次yield這個(gè)可迭代對(duì)象中的每一個(gè)值。

2.生成器表達(dá)式
if __name__ == '__main__':
    g = (i for i in range(10))
    print(type(g))

生成器.png

?????將列表推導(dǎo)式的方括號(hào)改為圓括號(hào)就是一個(gè)生成器表達(dá)式

Tips:

  • 生成器的本質(zhì)就是一個(gè)迭代器售睹,擁有__iter__()和__next__()方法桩警,只不過這個(gè)迭代器由開發(fā)人員自定義完成。
  • 調(diào)用生成器函數(shù)(含有yield關(guān)鍵字的函數(shù))時(shí)昌妹,它并不執(zhí)行只返回一個(gè)生成器捶枢,每次調(diào)用next方法會(huì)取到一個(gè)值,直到取到最后一個(gè)值捺宗,之后再執(zhí)行next會(huì)報(bào)錯(cuò)柱蟀,即生成器的惰性計(jì)算

獲取生成器中的值

1.next()方法

?????next()方法是Python中內(nèi)置的方法蚜厉,作用效果和__next__()一樣长已。next()方法的實(shí)現(xiàn)就是基于__next__()。由于是內(nèi)置方法所以next(g)這樣使用。

2.send()方法

????? send()方法和next()方法有一樣的作用术瓮,都可以獲得下一個(gè)值康聂,但是send()在獲取下一個(gè)值的時(shí)候會(huì)給上一個(gè)yield傳一個(gè)值,故send()不能用在第一個(gè)胞四。

?????下面是一個(gè)動(dòng)態(tài)求平均值恬汁,利用裝飾器和生成器來實(shí)現(xiàn)

"""
裝飾器用來消耗第一次yield,觸發(fā)send()
"""
def init(func):
    def inner(*args,**kwargs):
        g = func(*args,**kwargs)
        next(g)
        return g
    return inner

@init
def dynamiccal():
    sum = 0
    count = 0
    avg = 0
    while True:
        num = yield avg
        sum = sum + num
        count = count + 1
        avg = sum/count


if __name__ == '__main__':
    g = dynamiccal()
    for i in range(1,11):
        print(g.send(i),end='  ')

send.png
3.for

?????生成器一定是迭代器辜伟,所以一定可以被for循環(huán)取值氓侧。

g = generator()
    for i in g:
        print(g)
4.強(qiáng)制轉(zhuǎn)換為列表
g = generator()
list(g)

?????將在每次yield返回的值放在列表中,但是這并不是一個(gè)好方法导狡,這樣就失去了生成器的靈魂约巷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市旱捧,隨后出現(xiàn)的幾起案子独郎,更是在濱河造成了極大的恐慌,老刑警劉巖枚赡,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氓癌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贫橙,警方通過查閱死者的電腦和手機(jī)贪婉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來料皇,“玉大人谓松,你說我怎么就攤上這事〖粒” “怎么了鬼譬?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逊脯。 經(jīng)常有香客問我优质,道長(zhǎng),這世上最難降的妖魔是什么军洼? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任巩螃,我火速辦了婚禮,結(jié)果婚禮上匕争,老公的妹妹穿的比我還像新娘避乏。我一直安慰自己,他們只是感情好甘桑,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布拍皮。 她就那樣靜靜地躺著歹叮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铆帽。 梳的紋絲不亂的頭發(fā)上咆耿,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音爹橱,去河邊找鬼萨螺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛愧驱,可吹牛的內(nèi)容都是我干的慰技。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼冯键,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惹盼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惫确,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚯舱,沒想到半個(gè)月后改化,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枉昏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年陈肛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兄裂。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡句旱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晰奖,到底是詐尸還是另有隱情谈撒,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布匾南,位于F島的核電站啃匿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛆楞。R本人自食惡果不足惜溯乒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豹爹。 院中可真熱鬧裆悄,春花似錦、人聲如沸臂聋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钟哥,卻和暖如春迎献,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腻贰。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工吁恍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人播演。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓冀瓦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親写烤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翼闽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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