问题求一个列表中所有数字的和,其中有多个嵌套元素是数字或列表(列表也是数字或列表)。例如:[1,[2,[3,[4,5]]]]的和是15,[1,2,3,4,5]的和也是15。分析遍历每个元素,如果发现该元素不是列表,则进行累加,否则继续遍历该元素,直到找到该数。可以递归求解。defsum_ulist(exp):sum=0foriinexp:sum+=iiftype(i)!=listelsesum_ulist(i)returnsum可以看到最后的程序很短,运行如下:>>>sum_ulist([1,[2,[3,[4,5]]]])15>>>sum_ulist([1,2,3,4,5])15思维仍然是一个列表,数量不确定层层嵌套,这次不是求和,而是把所有的数都取出来,最后以列表的形式返回。和上面类似,但是上面的求和只关注每次函数调用中当前层数的求和,这里的递归需要把所有的数放在同一个列表中,可以利用默认参数的一个特性来解决.前面我们提到过,默认参数必须设置成不可变的,否则会导致一些问题:当你调用这个函数时没有指定默认参数的值,它会在第一次调用时自动使用默认参数的对象函数,如果Thisobject已经改变并且可能没有预期的效果。例如:defa(li=[]):li.append(1)returnli>>>a()[1]>>a()[1,1]>>>a()[1,1,1]这种情况很多时候并不是我们想要的,但是这里可以利用这个特性:defadd_ulist(exp,tem_li=[]):foriinexp:tem_li.append(i)iftype(i)!=listelseadd_ulist(i)returnsum通过在else语句后面的递归中不指定默认参数,我们让后面的函数调用只对第一次函数调用时初始化的tem_li对象进行操作,所以少写A几个字母:)像这样运行:>>>add_ulist([1,[2,[3,[4,5]]],[6,[7,8]]])[1,2,3,4,5,6,7,8]当然在else语句后面的递归中,也可以将这个函数得到的tem_li列表传递给默认参数:defadd_ulist(exp,tem_li=[]):fori在exp中:tem_li。append(i)iftype(i)!=listelseadd_ulist(i,tem_li)returnsum最后,如果你不知道默认参数的奇妙本质,让我们老老实实把默认参数设置为不可变对象:defadd_ulist(exp,tem_li=None):iftem_liisNone:tem_li=[]foriinexp:tem_li.append(i)iftype(i)!=listelseadd_ulist(i,tem_li)returnsum免费下载和试用:https://support.i-search.com.cn/
