少說話多寫程式碼之Python學習053——類的成員(生成器的使用:遞迴)
阿新 • • 發佈:2018-12-02
前面我們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