国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

由淺入深講解python中的yield與generator

2020-02-23 04:31:45
字體:
來源:轉載
供稿:網友

前言

本文將由淺入深詳細介紹yield以及generator,包括以下內容:什么generator,生成generator的方法,generator的特點,generator基礎及高級應用場景,generator使用中的注意事項。本文不包括enhanced generator即pep342相關內容,這部分內容在之后介紹。

generator基礎

在python的函數(function)定義中,只要出現了yield表達式(Yield expression),那么事實上定義的是一個generator function, 調用這個generator function返回值是一個generator。這根普通的函數調用有所區別,For example:

def gen_generator(): yield 1def gen_value(): return 1 if __name__ == '__main__': ret = gen_generator() print ret, type(ret) #<generator object gen_generator at 0x02645648> <type 'generator'> ret = gen_value() print ret, type(ret) # 1 <type 'int'>

從上面的代碼可以看出,gen_generator函數返回的是一個generator實例

generator有以下特別:

     •遵循迭代器(iterator)協議,迭代器協議需要實現__iter__ 、next接口

     •能過多次進入、多次返回,能夠暫停函數體中代碼的執行

下面看一下測試代碼: 

>>> def gen_example():... print 'before any yield'... yield 'first yield'... print 'between yields'... yield 'second yield'... print 'no yield anymore'... >>> gen = gen_example()>>> gen.next()    # 第一次調用nextbefore any yield'first yield'>>> gen.next()    # 第二次調用nextbetween yields'second yield'>>> gen.next()    # 第三次調用nextno yield anymoreTraceback (most recent call last): File "<stdin>", line 1, in <module>StopIteratio

調用gen example方法并沒有輸出任何內容,說明函數體的代碼尚未開始執行。當調用generator的next方法,generator會執行到yield 表達式處,返回yield表達式的內容,然后暫停(掛起)在這個地方,所以第一次調用next打印第一句并返回“first yield”。 暫停意味著方法的局部變量,指針信息,運行環境都保存起來,直到下一次調用next方法恢復。第二次調用next之后就暫停在最后一個yield,再次調用next()方法,則會拋出StopIteration異常。 

因為for語句能自動捕獲StopIteration異常,所以generator(本質上是任何iterator)較為常用的方法是在循環中使用: 

def generator_example(): yield 1 yield 2if __name__ == '__main__': for e in generator_example(): print e # output 1 2

generator function產生的generator與普通的function有什么區別呢

  (1)function每次都是從第一行開始運行,而generator從上一次yield開始的地方運行

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 弋阳县| 鄂托克前旗| 长汀县| 行唐县| 蓬溪县| 日照市| 黑河市| 河西区| 崇阳县| 萨迦县| 汝阳县| 休宁县| 阿拉善盟| 东安县| 东源县| 苍溪县| 兴宁市| 云和县| 库伦旗| 兰州市| 贵港市| 丰镇市| 海阳市| 玛多县| 安福县| 柏乡县| 岳西县| 比如县| 济源市| 白河县| 哈巴河县| 广平县| 七台河市| 右玉县| 耿马| 南召县| 格尔木市| 玉田县| 清流县| 上蔡县| 鄄城县|