遞迴生成器

2021-09-18 07:17:33 字數 1321 閱讀 2288

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]11

1112

2223

3344

4[5, [6, 7]]

[5, [6, 7]]55

55[6, 7]

[6, 7]66

6667

7777

888[1, 2, 3, 4, 5, 6, 7, 8]

可見,其中的yield nested用於生成每個最終的輸出值,而其中yield element的作用是向上傳遞yield nested的值,相當於接力器,所以每個值print(element)輸出的數量不一樣,越多說明遞迴呼叫的越深,需要傳遞的層數越多。

posted @

2018-12-04 18:32

mjl_cv 閱讀(

...)

編輯收藏

遞迴生成器

python基礎教程中 第2版 修訂版 p155頁有這樣一段 def flatten nested try for sublist in nested for element in flatten sublist yield element except typeerror yield nested...

Python遞迴生成器

學習python時,碰到乙個生成器的概念,有點意思,其實很簡單,基本上就是兩種策略 並不難,可以直接參考廖大的教程。這裡主要想說的是乙個程式,from python基礎教程 def yield test nested try for sublist in nested for element in ...

模擬遞迴生成器

與遞迴生成器實現同樣的功能,不過這裡使用非生成器的方法來模擬。def flatten nested result try for sublist in nested for element in flatten sublist print element element print rrrrrrrr...