#試想一下,如果我想把[[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 根據結果,我們一...