簡體   English   中英

python遞歸生成器失敗

[英]python recursive generator fail

我有嵌套的json對象,它包含列表和字典..我想在其中搜索所有“ foo”鍵。 我正在嘗試做遞歸生成器,但是在第二次調用parn dunno時函數失敗,為什么,我什至只看到一次“ in”輸出。 好像解釋器第二次沒有進入內部解析等等。幫助我了解我錯了嗎?

def parse(d,key):
    print('in')
    if type(d)==type({}):
        if key in d:
            yield d[key]
        for k in d:
            parse(d[k],key)
    if type(d)==type([]):
        for i in d:
            parse(i,key)

生成器不太像協程那樣工作。 如果生成器函數遞歸調用自身,則遞歸調用將生成另一個生成器對象。 控制不會像Lua這樣重新輸入生成器代碼,並且yield不會立即掛起整個生成器調用堆棧。 您必須遍歷返回的生成器對象並產生其元素:

def parse(d,key):
    print('in')
    if type(d)==type({}):
        if key in d:
            yield d[key]
        for k in d:
            for item in parse(d[k],key):
                yield item
    if type(d)==type([]):
        for i in d:
            for item in parse(i,key):
                yield item

在Python 3.3中,添加了yield from委派給子生成器的語法yield from ,因此代碼將減少為以下內容:

def parse(d,key):
    print('in')
    if type(d)==type({}):
        if key in d:
            yield d[key]
        for k in d:
            yield from parse(d[k],key)
    if type(d)==type([]):
        for i in d:
            yield from parse(i,key)

這具有自動處理sendthrow和一堆邊緣情況的優點,這些情況在子生成器上沒有顯式循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM