python yield

初始:將yield看作是return
重點(diǎn):
1)帶有yield的函數(shù)是生成器,不會(huì)像list一樣占用大量?jī)?nèi)存,使用iterator迭代,python3中的range已經(jīng)是range而不是一個(gè)list
2)就下面代碼來(lái)看g=foo()并不會(huì)打印任何東西,而是先得到一個(gè)generator,類(lèi)似實(shí)例化
3)直到generator的next/send方法,執(zhí)行到y(tǒng)ield sakura相當(dāng)于程序結(jié)束,并沒(méi)有走到打印res
4)再次執(zhí)行next(g)并不是從foo函數(shù)頭開(kāi)始,而是上次程序停止的地方執(zhí)行,但由于上次運(yùn)行已經(jīng)return sakura,所以print(res)的結(jié)果為None,程序繼續(xù)循環(huán)while,直到y(tǒng)ield sakura

def foo():
    print('starting....')
    while True:
        res = yield sakura
        print(res)

g = foo()
print(next(g))
print("*"*20)
print(next(g))
>>> sakura
>>> ********************
>>> None
>>> sakura

作用一:使用yield生成range

def foo(num):
    while num < 10:
        num+=1
        yield num
for n in foo(0):
    print(n)

作用二:大文件讀取,如果直接對(duì)文件對(duì)象調(diào)用 read() 方法,會(huì)導(dǎo)致不可預(yù)測(cè)的內(nèi)存占用,好的方法是利用固定長(zhǎng)度的緩沖區(qū)來(lái)不斷讀取文件內(nèi)容(這個(gè)是簡(jiǎn)寫(xiě)/復(fù)雜需要考慮換行,加緩存)

def read_file(dir_path):
    BLOCK_SIZE = 1024
    with open(dir_path,'rb') as f:
          while True:
              block = f.read(BLOCK_SIZE)
              if block:
                    yiled block
              else:
                    return

斐波那契數(shù)列

def foo(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b) 
        a, b = b, a+b
        n += 1

print(foo(100))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 之前一直對(duì)python的yield理解的有點(diǎn)模糊,昨天搜索發(fā)現(xiàn)了一個(gè)講解非常清楚的版本,所以mark一下。來(lái)源:p...
    俊采星馳_87e0閱讀 1,394評(píng)論 1 1
  • 以下內(nèi)容改編自廖雪峰老師的博客:https://www.ibm.com/developerworks/cn/ope...
    Vector_Wan閱讀 408評(píng)論 0 3
  • Python中,帶有 yield 的函數(shù)在 Python 中被稱(chēng)之為 generator(生成器),何謂 gene...
    TinlokLee閱讀 276評(píng)論 0 0
  • 首先,如果你還沒(méi)有對(duì)yield有個(gè)初步分認(rèn)識(shí),那么你先把yield看做“return”,這個(gè)是直觀的,它首先是個(gè)r...
    g_ices閱讀 156評(píng)論 0 1
  • 久違的晴天,家長(zhǎng)會(huì)。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí),離放學(xué)已經(jīng)沒(méi)多少時(shí)間了。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,822評(píng)論 16 22

友情鏈接更多精彩內(nèi)容