python中的yield有什么用

了解python中的yield有什么用?這個(gè)問(wèn)題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見(jiàn)到的。希望通過(guò)這個(gè)問(wèn)題能讓你收獲頗深。下面是小編給大家?guī)?lái)的參考內(nèi)容,讓我們一起來(lái)看看吧!

成都創(chuàng)新互聯(lián)是一家專業(yè)提供伊金霍洛企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)H5場(chǎng)景定制、小程序制作等業(yè)務(wù)。10年已為伊金霍洛眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

閱讀別人的python源碼時(shí)碰到了這個(gè)yield這個(gè)關(guān)鍵字,各種搜索終于搞懂了,在此做一下總結(jié):

通常的for…in…循環(huán)中,in后面是一個(gè)數(shù)組,這個(gè)數(shù)組就是一個(gè)可迭代對(duì)象,類似的還有鏈表,字符串,文件。它可以是mylist 

= [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。 它的缺陷是所有數(shù)據(jù)都在內(nèi)存中,如果有海量數(shù)據(jù)的話將會(huì)非常耗內(nèi)存。

生成器是可以迭代的,但只可以讀取它一次。因?yàn)橛玫臅r(shí)候才生成。比如 mygenerator = (x*x for x in 

range(3)),注意這里用到了(),它就不是數(shù)組,而上面的例子是[]。

我理解的生成器(generator)能夠迭代的關(guān)鍵是它有一個(gè)next()方法,工作原理就是通過(guò)重復(fù)調(diào)用next()方法,直到捕獲一個(gè)異常??梢杂蒙厦娴膍ygenerator測(cè)試。

帶有 yield 的函數(shù)不再是一個(gè)普通函數(shù),而是一個(gè)生成器generator,可用于迭代,工作原理同上。

yield 是一個(gè)類似 return 

的關(guān)鍵字,迭代一次遇到y(tǒng)ield時(shí)就返回yield后面的值。重點(diǎn)是:下一次迭代時(shí),從上一次迭代遇到的yield后面的代碼開(kāi)始執(zhí)行。

簡(jiǎn)要理解:yield就是 return 返回一個(gè)值,并且記住這個(gè)返回的位置,下次迭代就從這個(gè)位置后開(kāi)始。

帶有yield的函數(shù)不僅僅只用于for循環(huán)中,而且可用于某個(gè)函數(shù)的參數(shù),只要這個(gè)函數(shù)的參數(shù)允許迭代參數(shù)。比如array.extend函數(shù),它的原型是array.extend(iterable)。

send(msg)與next()的區(qū)別在于send可以傳遞參數(shù)給yield表達(dá)式,這時(shí)傳遞的參數(shù)會(huì)作為yield表達(dá)式的值,而yield的參數(shù)是返回給調(diào)用者的值?!獡Q句話說(shuō),就是send可以強(qiáng)行修改上一個(gè)yield表達(dá)式值。比如函數(shù)中有一個(gè)yield賦值,a 

= yield 5,第一次迭代到這里會(huì)返回5,a還沒(méi)有賦值。第二次迭代時(shí),使用.send(10),那么,就是強(qiáng)行修改yield 5表達(dá)式的值為10,本來(lái)是5的,那么a=10

send(msg)與next()都有返回值,它們的返回值是當(dāng)前迭代遇到y(tǒng)ield時(shí),yield后面表達(dá)式的值,其實(shí)就是當(dāng)前迭代中yield后面的參數(shù)。

第一次調(diào)用時(shí)必須先next()或send(None),否則會(huì)報(bào)錯(cuò),send后之所以為None是因?yàn)檫@時(shí)候沒(méi)有上一個(gè)yield(根據(jù)第8條)??梢哉J(rèn)為,next()等同于send(None)。

yield簡(jiǎn)單說(shuō)來(lái)就是一個(gè)生成器,生成器是這樣一個(gè)函數(shù),它記住上一次返回時(shí)在函數(shù)體中的位置。對(duì)生成器函數(shù)的第二次(或第 n 次)調(diào)用跳轉(zhuǎn)至該函數(shù)中間,而上次調(diào)用的所有局部變量都保持不變。

生成器是一個(gè)函數(shù),

函數(shù)的所有參數(shù)都會(huì)保留,

第二次調(diào)用此函數(shù)時(shí),

使用的參數(shù)是前一次保留下的。

生成器還“記住”了它在流控制構(gòu)造。

生成器不僅“記住”了它數(shù)據(jù)狀態(tài)。 生成器還“記住”了它在流控制構(gòu)造(在命令式編程中,這種構(gòu)造不只是數(shù)據(jù)值)中的位置。由于連續(xù)性使您在執(zhí)行框架間任意跳轉(zhuǎn),而不總是返回到直接調(diào)用者的上下文(如同生成器那樣),因此它仍是比較一般的。

yield生成器的運(yùn)行機(jī)制

當(dāng)你問(wèn)生成器要一個(gè)數(shù)時(shí),生成器會(huì)執(zhí)行,直至出現(xiàn) yield 語(yǔ)句,生成器把 yield 的參數(shù)給你,之后生成器就不會(huì)往下繼續(xù)運(yùn)行。 當(dāng)你問(wèn)他要下一個(gè)數(shù)時(shí),他會(huì)從上次的狀態(tài)開(kāi)始運(yùn)行,直至出現(xiàn)yield語(yǔ)句,把參數(shù)給你,之后停下。如此反復(fù)直至退出函數(shù)。

例子:Python 排列,組合生成器

生成全排列

def perm(items, n=None):
    if n is None:
        n = len(items)
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[:i] + items[i+1:]
            for p in perm(rest, n-1):
                yield v + p

生成組合

def comb(items, n=None):
    if n is None:
        n = len(items)    
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[i+1:]
            for c in comb(rest, n-1):
                yield v + c
  
a = perm('abc')
for b in a:
    print b
    break
print '-'*20
for b in a:
    print b

結(jié)果如下:

102 pvopf006 ~/test> ./generator.py
abc
--------------------
acb
bac
bca
cab
cba

可以看到,在第一個(gè)循環(huán)break后,生成器沒(méi)有繼續(xù)執(zhí)行,而第二個(gè)循環(huán)接著第一個(gè)循環(huán)執(zhí)行。

感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)python中的yield有什么用大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章標(biāo)題:python中的yield有什么用
分享URL:http://www.muchs.cn/article36/gcegsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、服務(wù)器托管、網(wǎng)站制作網(wǎng)站排名、定制網(wǎng)站、定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)