遞迴生成器 filter函式與無限生成器結合使用遇到的問題
阿新 • • 發佈:2018-12-04
python基礎教程中(第2版 修訂版)p155頁有這樣一段程式碼:
def flatten(nested): try: for sublist in nested: for element in flatten(sublist): yield element except TypeError: yield nested list(flatten([[[1], 2], 3, 4, [5, [6, 7]], 8])) 輸出: [1, 2, 3, 4, 5, 6, 7, 8]
這是遞迴生成器的使用。其它遞迴生成器可參考 filter函式與無限生成器結合使用遇到的問題 。
除錯程式碼:
def flatten(nested): try: print(nested) for sublist in nested: print('\n') print(sublist) for element in flatten(sublist): print(element) yield element except TypeError:yield nested list(flatten([[[1], 2], 3, 4, [5, [6, 7]], 8])) 輸出: [[[1], 2], 3, 4, [5, [6, 7]], 8] [[1], 2] [[1], 2] [1] [1] 1 1 1 1 1 2 2 2 2 3 3 3 4 4 4 [5, [6, 7]] [5, [6, 7]] 5 5 5 5 [6, 7] [6, 7] 6 6 6 6 6 7 7 7 7 7 8 8 8 [1, 2, 3, 4, 5, 6, 7, 8]
可見,其中的yield nested用於生成每個最終的輸出值,而其中yield element的作用是向上傳遞yield nested的值,相當於接力器,所以每個值print(element)輸出的數量不一樣,越多說明遞迴呼叫的越深,需要傳遞的層數越多。