1. 程式人生 > >遞迴生成器 filter函式與無限生成器結合使用遇到的問題

遞迴生成器 filter函式與無限生成器結合使用遇到的問題

  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)輸出的數量不一樣,越多說明遞迴呼叫的越深,需要傳遞的層數越多。