1. 程式人生 > >少說話多寫程式碼之Python學習053——類的成員(生成器的使用:遞迴)

少說話多寫程式碼之Python學習053——類的成員(生成器的使用:遞迴)

前面我們get到了一個技能,生成器。
那麼如果我們想依次輸出一個數組,但是陣列中又巢狀陣列,又巢狀陣列...巢狀未知層,那麼如何實現?如果使用for可能就有點不方便了,這時我們需要遞迴。
我們可以這樣做,

def myFlatten(seq):
    try:
        for list in seq:
            for item in myFlatten(list):
                yield  item
    except Exception:
        yield  seq

測試我們的程式碼

seque=[[1,[2,[3]]],[4,[5,[6,[7,[8]]]]],[9,10],[11]]

for item in myFlatten(seque):
    print(item)

輸出

1
2
3
4
5
6
7
8
9
10
11
print(list(myFlatten(seque)))

輸出

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

對於上述實現方式,我們發現並不完善,如果陣列是字串那就可能引發typeError異常。於是我們增加一個檢查的邏輯。

def myFlattenAdvance(seq):
    try:
        try: seq+''
        except TypeError:
            pass
        else:raise  TypeError
        for list in seq:
            for item in myFlattenAdvance(list):
                yield  item
    except Exception:
        yield  seq

發現型別錯誤,則在異常中處理,本段程式碼中,我們不做異常處理。
測試呼叫如下,

strSeq=['魔禮青',['魔禮海',['魔禮紅','魔禮壽']]]
for item in myFlattenAdvance(strSeq):
    print(item)

輸出

魔禮青
魔禮海
魔禮紅
魔禮壽
print(list(myFlattenAdvance(strSeq)))

輸出

['魔禮青', '魔禮海', '魔禮紅', '魔禮壽']

這樣我們可以遞迴字串型別的陣列了。
工程檔案下載:https://download.csdn.net/download/yysyangyangyangshan/10821963