python教程(九)之特性(6 遞迴生成器)

2021-10-07 08:35:40 字數 1410 閱讀 8009

#試想一下,如果我想把[[1,2],[3,4],5]變為[1,2,3,4,5],需要做什麼

#大致的辦法你應該可以很快想到,利用迴圈遍歷,如果是列表就拆開

#那如果[[1,[2],3],[4,5]]甚至更多層,用迴圈還能處理的了嗎

#遞迴會是你最好的選擇,利用我們之前學的生成器,我們可以更好地做到

def

flatten

(arg)

:try

:for sublist in arg :

for element in flatten(sublist)

:yield element

except typeerror :

yield arg a=[

[1,[

2],3

],[4

,5]]

print

(list

(flatten(a)))

#[1, 2, 3, 4, 5]

#如果乙個函式定義中包含yield關鍵字,那麼這個函式就不再是乙個普通函式,而是乙個generator

#generator和函式的執行流程不一樣,函式是順序執行,遇到return語句或者最後一行函式語句就返回

#變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行

#也許你還不是很明白,我這裡解釋一下

#上面的**中沒有用到next,也就不涉及到從上次返回的yield語句處繼續執行這個特點

#生成器返回的是乙個演算法,只有你去訪問它時才會給你乙個可讀的結果

for i in flatten(a)

:print

(i)# 1

# 2# 3

# 4# 5

print

(flatten(a)

)#

#這裡出一道題,下一次會公布答案

# 期待輸出:

# [1]

# [1, 1]

# [1, 2, 1]

# [1, 3, 3, 1]

# [1, 4, 6, 4, 1]

# [1, 5, 10, 10, 5, 1]

# [1, 6, 15, 20, 15, 6, 1]

# [1, 7, 21, 35, 35, 21, 7, 1]

# [1, 8, 28, 56, 70, 56, 28, 8, 1]

# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

# 這是個楊輝三角,不知道的可以查一下,使用遞迴生成器,生成這樣的結果

python教程(九)之特性(1 建構函式)

特性,指的是python自身就擁有的方法,而不是需要程式設計者自己寫函式來實現 建構函式,不同於普通方法,它將在物件建立後自動呼叫它們 class foobar def init self pass f foobar f.init 例如init這個類中的方法,如果你需要在物件中新增屬性並賦值,就需要...

python教程(九)之特性(3 函式super)

super 呼叫這個函式時,將當前類和當前例項作為引數 對其返回的物件呼叫方法時,呼叫的是超類 例如之前的bird 而不是當前類 所以在songbird的建構函式中,可以使用super songbird,self 在python3中,super可不提供任何引數 class bird def init...

python教程(九)之特性(5 生成器)

列表生成器可以生成我們需要的列表,但是有時候我們不需要一整個列表,只需要一部分 因為列表不僅占用記憶體,而且當我們需要處理它的時候經常需要進行迭代 活用生成器則會避開這個問題 a x x for x in range 10 print a at 0x00000000027f5e08 根據結果,我們一...