您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > python核心编程第二版课后题答案第六章
defidcheck():'''6-2修改idcheck使之可以检测长度为一得标识符,并且可识别Python关键字'''importstringimportkeywordkeys=keyword.kwlistalphas=string.letters+'_'nums=string.digitsalphanums=alphas+numsprint'WelcometotheIdentifierCheckV1.1'myInput=raw_input('identifiertotest:')isOne=False#是否是一个字符iflen(myInput)==1:isOne=FalseifmyInputinkeys:print'''invalid:symbolhasbeendefined'''returnFalseelifmyInput[0]notinalphas:print'''invalid:firstsymbolmustbealphabetic'''returnFalseelifnotisOne:otherInput=myInput[1:]forotherCharinotherInput:ifotherCharnotinalphanums:print'''invalid:remainnsymbolsmustbealphanumeric'''returnFalseprintokayasanIdentifierreturnTruedeforder(nlist):'''6-3(a)输入一串数字,从大到小排列注意:输入的是一个列表,其中的值为数字'''newlist=[]forxinnlist:newlist.append(int(x))returnsorted(newlist,reverse=True)deforder2(nlist):'''6-3(b)和a一样,不过要用字典序注意:字典序就是按字典的排列方式,比如21就大于111,因为2大于1方式就是把输入的数字变成字符串即可'''#将里面的元素统统变成字符串先newlist=[]forxinnlist:newlist.append(str(x))newlist=sorted(newlist,reverse=True)fori,xinenumerate(newlist):newlist[i]=int(x)returnnewlistdefavescore():'''输入测试得分,算出平均值'''scorelist=[]#分数列表whileTrue:myinput=raw_input('Inputthescore(ifNonumberquite):')try:scorelist.append(float(myinput))except:breakifnotlen(scorelist):returnFalsereturnsum(scorelist)/len(scorelist)defshowstr():'''6-5(a)更新2-7使之可以每次向前向后都显示一个字符串的一个字符'''istr=raw_input('Inputstring:')lens=len(istr)iflens==0:returnFalseiflens==1:printistrreturnTruefori,jinenumerate(istr):ifi==0andlen(istr)!=1:printj,istr[i+1]elifi==len(istr)-1andi!=0:printistr[i-1]else:printistr[i-1],j,istr[i+1]returnTruedefmycmp():'''6-5(b)通过扫描判断两个字符串是否匹配,不能使用比较操作符或者cmp()'''str1=raw_input('Firststring:')str2=raw_input('Secondstring:')equal=len(str1)-len(str2)ifnotequal:returnFalse#表示长度不相等#将字符串变成列表fori,jinenumerate(str1):iford(j)-ord(str2[i]):#如果减下来不为0returnFalsereturnTruedefisback():'''6-5(c)判断一个字符串是否是回文,忽略控制符号和空格[支持中文]'''importstring#控制符表示ASCII码中0~31以及127这33个无法输出的字符denny=[chr(i)foriinxrange(0,32)]+list(string.whitespace)denny.append(chr(127))strs=raw_input('Pleaseinputstring:')#将输入的数据解码成unicode因为在windows上默认是gbk,所以这里是gbk#如果是在其他命令行中,应该以命令行输入的字符编码为主strs=strs.decode('gbk')new=[]foriinstrs:ifiindenny:continuenew.append(i)lens=len(new)iflens%2:returnFalseelse:half=lens/2ifnew[0:half]==new[-1:-half-1:-1]:returnTruereturnFalsedefbeback():'''6-5(d)输入一个字符串在后面重复一个反向拷贝,构成回文'''strs=raw_input('Inputstring:')#将输入的数据解码成unicode因为在windows上默认是gbk,所以这里是gbk#如果是在其他命令行中,应该以命令行输入的字符编码为主strs=strs.decode('gbk')#解码为unicodelens=len(strs)#这里之所以是-1:-lens-1:-1#分析如下:-1就是倒数第一个,-(lens+1)就是长度,-1是步进#就是说从倒数第一个开始-1(步进),一直减到倒数lens+1,由于切片里是[a:b]是a=xb的,#所以这里是lens+1而不是lensreturnstrs+strs[-1:-lens-1:-1]defstrip():'''6-6去掉输入的字符串的前面和后面的空格'''strs=raw_input('Inputstring:').decode('gbk')new=u''#由于只是去掉前面和后面的空格,所以不能遍历全部#分析,从前面遍历到非空格停止,从后面遍历到非空格位置#为了方便,我首先将字符串变成了列表strs=list(strs)lens=len(strs)foriinrange(0,lens):#从前面开始遍历ifstrs[i]=='':strs[i]=''else:breakforiinrange(-1,-lens-1,-1):ifstrs[i]=='':strs[i]=''else:break#将list转成字符串nstrs=''foriinrange(0,lens):nstrs+=strs[i]returnnstrsdefnum2eng():'''6-8输入一个整数,返回相应的英文,限定0~1000'''lists=['zero','one','two','three','four','five','six','seven','eight','nine']new=''whileTrue:try:iput=int(raw_input('Pleaseinputaint(0~1000):'))ifiput0oriput1000:continueexcept:continuebreakiput=str(iput)forjiniput:new+=lists[int(j)]+'-'returnnew[0:-1]defminute2time():'''6-9输入分钟,返回小时数和分钟'''minute=int(raw_input('Pleaseinputaminutes:'))hours=minute/60newminute=minute-hours*60return'%d:%02d'%(hours,newminute)deflike():'''6-10写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转例如:Mr.Ed返回mR.eD'''importstringimportrandomLetter=string.ascii_uppercase#大写字母字符串letter=string.ascii_lowercase#小写字母字符串name=raw_input('Inputstring:')newname=''foriinname:ifiinLetter:newname+=random.choice(letter)continueifiinletter:newname+=random.choice(Letter)continuenewname+=ireturnnewnamedefint2ip():'''6-11(a)创建一个整数到IP地址的转换'''ints=raw_input('InputInt:')#分析ip地址和整数的关系#ip地址是由4个字节组成,每个字节8位,换成16进制就是8位#FF.FF.FF.FF===11111111111111111111111111111111#那么后面就是一个4位的二进制了#我们要做的就是将十进制的长整数换成4个字节的二进制或者4个16进制,然后再将每个字节转成独立的十进制#整数转成四个字节其实就是整数转16进制hexs=hex(int(ints))[2:]#hex转换后把最前面一个0x先去掉,然后在前面填0whilelen(hexs)8:hexs='0'+hexsip1=int(hexs[0]+hexs[1],16)ip2=int(hexs[2]+hexs[3],16)ip3=int(hexs[4]+hexs[5],16)ip4=int(hexs[6]+hexs[7],16)return'%03d.%03d.%03d.%03d'%(ip1,ip2,ip3,ip4)defip2int():'''6-11(b)将ip地址转成整数'''ip=raw_input('InputIp:')#分析:#首先将ip转成列表#然后变成十六进制,合并在一起#然后将十六进制转成十进制ips=ip.split('.')ip=[]foriinxrange(0,4):ip.append(int(ips[i]))ip[i]=hex(ip[i])[2:]iflen(ip[i])==1:ip[i]='0'+ip[i]returnint(ip[0]+ip[1]+ip[2]+ip[3],16)deffindchr(string,char):'''6-12(a)在string中寻找char找到返回索引,找不到返回-1不能使用find或者index方法'''#strs=raw_input('Inputstring:')#char=raw_input('Inputchar:')#书中并没有说是找一个字符还是多个,我们假设为多个lens=len(char)#计算出char的长度#我们可以用in来指导是否存在ifcharnotinstring:return-1fori,jinenumerate(string):ifjinchar:#找到一个首字母哦~~~ifstring[i:i+lens]==char:#检查是否匹配returnireturn-1defrfindchr(string,char):'''6-12(b)和findchr类似,不过是从后面往前面找'''lens=len(char)lenstr=len(string)ifcharnotinstring:return-1rstring=string[::-1]#倒置的stringfori,jinenumerate(rstring):ifjinchar:#索引比长度小1
本文标题:python核心编程第二版课后题答案第六章
链接地址:https://www.777doc.com/doc-4210884 .html