昨天说到按值传递和按引用传递,总之,用起来的话,列表是按引用,字符串用起来和整数或浮点一样。
所以说如果要复制一个列表,就直接用[::]吧。
说到第一个练习题,其实这个在很多地方都做过,之前做过一个求当前目录下所有文件数量的题,其实和这一题是一样的,但今天在上班的时候对这个有些不清楚。
刚回到家整理思路以后,总算是解出了这个 问题,以防后续对与递归还是稀里糊涂的话,我看能不能分析一些经验出来。
先上代码
1 def nested_sum(list): 2 sum = 0 3 for item in list: 4 if type(item) == type([]): 5 item = nested_sum(item) 6 sum = sum + item 7 return sum 8 9 print(nested_sum([1,[1,2],[1,2,[1,2]]]))
我再之前的代码里是搞不清这里关系的,我现在突然回忆起我之前说过的一些话,怎么去思考递归,就是假设这个函数功能实现了。
我们借着这个思路推过去,假设我们nested_sum函数实现了,如果碰到是列表的话,那就是直接调用这个函数,得到他的返回值就好了,我们就可以开心的累加了,没了,就这么结束了,简单的让我怀疑人生。
下一个题莫名的花费了比较多的时间,其实这个题也是个经典的题目,在很多地方都看到过,就是一个双层循环。
1 def cumsum(list): 2 new_list = [] 3 for i in range(len(list)): 4 sum = 0 5 for j in range(i+1): 6 sum = sum + list[j] 7 new_list.append(sum) 8 return new_list 9 10 print(cumsum([1,2,3]))
这道题为什么话费了很长的时间,一是,有点急于求成,其实在双层循环还没完全弄清楚时,有些强行一次写完所有代码了,有些事还是一个个函数分解清楚,也许会更清楚。
二是,自己对range的理解出现了偏差,range(0)其实是一次都没有,range(1)是一次,但是这个值却是0,这个是需要我吸取教训的。
练习10.8暂时跳过
然后跳到一个很重要的习题,手写二分法,一开始写的很乱,在回忆起之气那用start 和 end来标志好的话,发现逻辑会更清晰一些,就做了一个这样的版本
1 def in_bisect(lb, target): 2 start_point = 0 3 end_point = len(lb) 4 middle_point = int((start_point + end_point) / 2) 5 6 # middle = int(len(lb) / 2) 7 count = 0 8 while True: 9 if target > lb[middle_point]: 10 start_point = middle_point 11 middle_point = int((start_point + end_point) / 2) 12 count += 1 13 elif target < lb[middle_point]: 14 end_point = middle_point 15 middle_point = int((start_point + end_point) / 2) 16 count += 1 17 else: 18 return middle_point, count 19 20 lb = [] 21 for i in range(113809): 22 lb.append(i) 23 24 print(in_bisect(lb, 1))
理论上应该是没有问题的,不过我也不知道,毕竟只测试了几个数值。
然后再跳过10.11与10.12的练习,后来再补。