生成器(yield [from]) --使用的兩個(gè)例子

使用示例1:創(chuàng)建處理數(shù)據(jù)的管道

具體描述:我們想以流水線式的形式對(duì)數(shù)據(jù)進(jìn)行迭代處理(類似Unix下的管道)。比方說我們有海量的數(shù)據(jù)需要處理,但是沒法完全的將數(shù)據(jù)加載到內(nèi)存中去。

解決方案:生成器函數(shù)是一種實(shí)現(xiàn)管道機(jī)制的好方法(具體代碼不做描述了,這里簡單介紹下原理)

原理剖析:
1、yield語句表現(xiàn)為數(shù)據(jù)的生產(chǎn)者,for循環(huán)表現(xiàn)為數(shù)據(jù)的消費(fèi)者;
2、由于處理過程的迭代特性,這里只會(huì)用到非常少的內(nèi)存。

使用示例2:我們有一個(gè)嵌套序列,想將它扁平化處理為一列單獨(dú)的值

解決方案:通過寫一個(gè)帶有yield from語句的遞歸生成器函數(shù)來解決
import collections
def flatten(items, ingore_types=(str, bytes)):
    for x in items:
        # isinstance(x, collections.Iterable) 檢查是否有某個(gè)元素是可迭代的;
        # 如果有,那么就用yield from將這個(gè)可迭代對(duì)象作為一種子例程進(jìn)行遞歸,它將所有的值都產(chǎn)生出來
        if isinstance(x, collections.Iterable) and not isinstance(x, ingore_types):
            # not isinstance(x, ingore_types)是為了避免將字符串和字節(jié)串解釋為可迭代對(duì)象,進(jìn)而將他們展開為單獨(dú)的一個(gè)個(gè)字符
            yield from flatten(x)
        else:
            yield x

items = [1, 2, [3, 4, [5, 6], 7], 8]
for x in flatten(items):
    print(x)
    
1
2
3
4
5
6
7
8

關(guān)于為何過濾not isinstance(x, ingore_types), 實(shí)例如下:

items = ['Dave', 'Paula', ['Thomas', 'Lewis']]
for x in flatten(items):  # 輸出了整個(gè)字符串(并沒有迭代字符串)
    print(x)
    
Dave
Paula
Thomas
Lewis
總結(jié):

如果想編寫生成器用來把其他的生成器當(dāng)做子例程來調(diào)用,yield from是個(gè)不錯(cuò)的快捷方式。

?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 原創(chuàng)文章&經(jīng)驗(yàn)總結(jié)&從校招到A廠一路陽光一路滄桑 詳情請(qǐng)戳www.codercc.com 主要知識(shí)點(diǎn):迭代器、生成...
    你聽___閱讀 894評(píng)論 0 1
  • 石澳,偶遇的女生分享給我的一個(gè)地方,她說她喜歡休息日在沙灘喝啤酒。帶著這份好奇,決定前往此地。 9...
    曾啊嬤閱讀 346評(píng)論 0 0
  • 深夜感嘆,開啟屬於自己的第一篇電子紀(jì)錄,小日記嗎? 算是吧,我就把這當(dāng)自己的小日記本了。來不及或是不想用原始的手寫...
    _羋小念_閱讀 241評(píng)論 0 0
  • 給生活一點(diǎn)樣子。。。
    凡如自然閱讀 234評(píng)論 0 0
  • 我也軟軟的,希望你可以把我抱在懷里揉搓。
    沒人知道我是誰真是再好不過了閱讀 499評(píng)論 0 0

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