遇到问题,抓住里面的关键信息,把这些关键信息转化成你掌握的函数和方法,才是解决未知问题的方法。1.编写一个函数sumall,它接受任意数量的参数并返回它们的总和。如果你写sum(1,2,3),你会得到一个错误:sumexpectedatmost2arguments,got3acceptsmultipleparameters。我知道需要用tuple,但是不知道在哪里,所以先这样写:defsumall(t):returnsum(*t)t=(1,2,3,4)sumall(t)------------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)in3返回总和(*t)4t=(1,2,3,4)---->5sumall(t)insumall(t)1#Exercise:编写一个接收函数sumall任意数量的参数并返回它们的总和2defsumall(t):---->3returnsum(*t)4t=(1,2,3,4)5sumall(t)TypeError:sumexpectedatmost2个参数,得到4个错误提示差不多,然后解决求和题sum(1,2)--------------------------------------------------------------------------TypeErrorTraceback(大多数最近调用last)in---->1sum(1,2)TypeError:'int'objectisnotiterable当你发现错误的时候,你通常会先复制这个去搜索,但是有时候你发现的和你想要的不一样的时候,你可以去官方文档看看。有时候官方文档解释的很清楚,参数代表什么,并举例说明。sum的解释不够清楚,尤其是iterable代表什么不清楚。这时候在搜索pythonsum的时候,很多网友都会在网上解释一些函数和方法,方便别人学习。发现菜鸟教程里面解释的比较清楚。写iterable就是一个可迭代的对象,比如list,tuple,collection。这个我很清楚,第二个参数是用来加iterable的sum的,默认0,可选。defsumall(*args):returnsum(args)sumall(1,2,3)*args可以传多个参数,函数会把所有的参数收集到一个tuple中,这样sum(args)实际上就是调用了tuple。2.按字长降序对一个词列表进行排序,等词长随机排序提示:参考random模块的random函数,看排序先想到什么可以排序,列表。按长度排序,需要先求出每个词的长度,需要用循环遍历词表。然后先按长度排序,长度相等的随机排序。这涉及多级排序。我去官方文档查了多级排序。虽然可以指定几种排序条件,但它们都使用一个通用的排序标准,或者说降序,要么升序。我以为我可以只使用两个长度和单词,按降序排列长度,随机排序单词,但是没有随机排序。在看random函数的时候,产生了随机数,这让我想起了可以在length和word之间插入一个随机值,然后统一降序排序,这样就可以随机排序word了。defsort_by_length(words):t=[]forwordinwords:t.append((len(word),word))t.sort(reverse=True)res=[]forlength,wordint:res.append(word)returnreswords=('ab','bcd','ac')sort_by_length(words)这是一个按长度排序的例子,所以我们要做的就是在长度和单词之间插入一个随机值,但是要注意产生随机值的位置,不能在循环外,这样从头到尾只产生一个随机值,一定是在循环内,每次产生不同的随机值实现效果importrandomdefsort_by_length(words):t=[]forwordinwords:rand=random.random()#循环生成一个随机值t.append((len(word),rand,word))#随机值夹在长度和单词之间t.sort(reverse=True)res=[]forlength,rand,wordint:res.append(word)returnreswords=('ab','bcd','ac','bc','cd','ae','ba')sort_by_length(words)['bcd','ba','cd','ab','bc','ac','ae']这道题的启示是,有些效果在代码中可能没有描述的那样直接实现。当然,我们首先要找到最直接的方法。比如,如果我们可以对两个维度进行不同的排序,并且有随机排序,我们自然应该使用最直接的方法,但如果不能,我们应该学会使用灵活的方法,把握关键词,比如这一个中的随机,以及然后阅读官方文档或者在网上搜索随机相关的函数和方法,看看有没有别的方法可以解决这个问题。实际上,没有提示这样的东西。学会掌握关键信息,才是我们应该掌握的能力。3.编写一个函数most_frequent,它接收一个字符串并按频率降序打印这些字母。首先找到里面的关键词,字符串,频次,降序。字符串中每个字母的频率技巧在《Python自学日记7-词典》中已经讲过,排序也刚刚掌握,所以这道题只需要结合这两个就出来了。d=dict()#因为用到了下面的函数,所以把它作为一个全局变量放出来defhistogram(s):#用一个字典作为计数器集合,为cins:d[c]=int(d.get(c,'0'))+1returnddefmost_frequent(a):histogram(a)c=[]forkey,valind.items():c.append((val,key))#反转键和value放在list中为了方便,按照value的大小排序c.sort(reverse=True)res=[]forval,keyinc:res.append(key)print(res)most_frequent('adffdadfafasdfafdafadf')['f','a','d','s']返回值符合预期,证明这个方法是正确的。读入单词表,将单词表中的字母按出现频率降序排列。这个一开始很简单,然后代码如下:d=dict()defhistogram(s):forcins:d[c]=int(d.get(c,'0'))+1返回ddefmost_frequent(a):histogram(a)c=[]forkey,valind.items():c.append((val,key))c.sort(reverse=True)res=[]forval,keyinc:res.append(key)print(res)#most_frequent('adffdadfafasdfafdafadf')fin=open('words.txt').read()t=most_frequent(fin)forxint:print(x)['\n','e','s','i','a','r','n','t','o','l','d','c','u','g','p','m','h','b','y','f','k','v','w','z','x','j','q']-------------------------------------------------------------------------TypeErrorTraceback(最近调用最后)in22#a=print(t)23#type(a)--->24forxina:25print(x)26#defread_file(filename):TypeError:'NoneType'objectisnotiterable发现报错后,一开始以为是列表最前面的'n'造成的错误,我想用切片去掉第一个'n':fin=open('words.txt').read()t=most_frequent(fin)[1:]forxint:print(x)结果还是一样的错误,说明不是这个问题。不知道能不能把'n'从源码里去掉,然后再去比较麻烦,答案是没有把'n'从文件里去掉去掉也搞定了,所以我开始找我的地方可能出错了,最后发现一个问题,就是把print(res)改成返回res,显示就正常了d=dict()defhistogram(s):forcins:d[c]=int(d.get(c,'0'))+1返回ddefmost_frequent(a):histogram(a)c=[]forkey,valind.items():c.append((val,key))c.sort(reverse=True)res=[]forval,keyinc:res.append(key)#print(res)returnres#most_frequent('adffdadfafasdfafdafadf')fin=open('words.txt').read()t=most_frequent(fin)forxint:print(x)esi...q但是这个打印的结果是垂直的,一开始我以为是列表的形状原因,但是垂直列表和水平列表显然是一样的。这时候我就想起来了,既然问题出在最后一个列表,那就分两种情况,看最后结果t的类型。结果在前面是print(res)的时候,t的类型是Nonetype,而使用returnres的时候,t的类型是list,就是这个原因。所以要注意区分打印和退货。虽然返回结果往往看起来一样,但它们的类型是不同的。你需要养成经常使用type来测试各种返回值类型的习惯。