在乙個巢狀了多個元素為數字或列表 (列表中也是數字或列表) 的列表中,求出所有數字的和。
例如: [1, [2, [3, [4, 5]]]] 的和為 15,[1, 2, 3, 4, 5] 的和也為 15。
通過遍歷每乙個元素,如果發現這個元素不是列表,就把它累加,否則繼續遍歷這個元素直到找到數字。可以採用遞迴的方式來求解。
def
sum_ulist
(exp)
:sum=0
for i in exp:
sum+= i if
type
(i)!=
list
else sum_ulist(i)
return
sum
可以看到最後的程式非常短小,執行如下:
>>
> sum_ulist([1
,[2,
[3,[
4,5]
]]])
15>>
> sum_ulist([1
,2,3
,4,5
])15
還是乙個不定巢狀層數的列表,這次不進行求和,而是把其中的所有數字都取出來,最後放在乙個列表中返回。
與上面類似,不過上面的求和在每一次函式呼叫中只關注當前層級的總和即可,而這邊的遞迴需要把數字都放在同乙個列表中,可以利用預設引數的乙個特性來解決。
我們之前提到,預設引數必須設定為不可變,否則會帶來一些問題:當你呼叫此函式卻不指定預設引數的值時,它會自動使用函式第一次呼叫中預設引數的物件,如果這個物件發生了改變,可能達不到我們預期的效果。
舉個例子:
def
a(li=
):1)
return li
>>
> a()[
1]>>
> a()[
1,1]
>>
> a()[
1,1,
1]
這種情況在很多時候都不是我們想要的,這邊卻可以利用這個特性:
def
add_ulist
(exp, tem_li=
):for i in exp:
iftype
(i)!=
list
else add_ulist(i)
return
sum
通過在 else 語句後面的遞迴中不指定預設引數,我們就讓後面的函式呼叫都只操作第一次函式呼叫時初始化的 tem_li 物件了,少寫了幾個字母 ?
執行如下:
>>
> add_ulist([1
,[2,
[3,[
4,5]
]],[
6,[7
,8]]
])[1
,2,3
,4,5
,6,7
,8]
當然,在 else 語句後面的遞迴中將這次函式獲得的 tem_li 列表傳給預設引數也可以:
def
add_ulist
(exp, tem_li=
):for i in exp:
iftype
(i)!=
list
else add_ulist(i, tem_li)
return
sum
最後,如果弄不清楚預設引數的奇妙性質的話,還是老老實實將預設引數設定為不可變物件吧:
def
add_ulist
(exp, tem_li=
none):
if tem_li is
none
: tem_li =
for i in exp:
iftype
(i)!=
list
else add_ulist(i, tem_li)
return
sum
演算法題 不定列表求和
可以看到最後的程式非常短小,執行如下 sum ulist 1,2,3,4,5 15sum ulist 1,2,3,4,5 15思考 還是乙個不定巢狀層數的列表,這次不進行求和,而是把其中的所有數字都取出來,最後放在乙個列表中返回。與上面類似,不過上面的求和在每一次函式呼叫中只關注當前層級的總和即可,...
python函式不定引數求和
想最快的入門python嗎?請搜尋 泉小朵 來學習python最快入門教程。也可以加入我們的python學習q群 902936549,送給每一位python的小夥伴教程資料。先來看python函式定引數求和 def dup1 m n l total 0 total m n l return tota...
排序演算法(不定時更新 )
插入排序 插入排序 初始時,拿第二個和第乙個比較,如果第二個小於第乙個,兩個交換 當進行到第n次時,前面的n 1個順序應該是正確的 拿第n個和前面的n 1個數比較,如果第m個小於n,m 1大於n,則把n插到m和m 1中間 相當於將n和前乙個數比較,如果前乙個數大於n,則把前乙個移動到n的位置上,內層...