Python核心编程(第二版) 第六章习题答案
6–1.字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串
是否是另一个大字符串的一部分?
答:有,string.find(str,beg,end)
6–2.字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且
可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 keyword.kelist)来帮你.
1 #!/usr/bin/python 2 3 import string 4 import keyword 5 import sys 6 7 Startwith=string.letters+'_' 8 Othersymbol=string.letters+'_'+string.digits 9 def CheckID(s): 10 if s[0] in Startwith: 11 if len(s)==1: 12 print "The ID is valid" 13 if s in keyword.kwlist: 14 print "And the ID is a key word" 15 else: 16 for j in s[1:]: 17 if j not in Othersymbol: 18 print "The other symbol is invalid." 19 sys.exit() 20 print "The ID is valid." 21 if s in keyword.kwlist: 22 print "And the ID is a key word" 23 else: 24 print "The startwith is invalid." 25 26 27 28 29 if __name__=="__main__": 30 sid=raw_input("Enter a string:") 31 CheckID(sid)
6–3.排序
(a) 输入一串数字,从大到小排列之.
(b) 跟 a 一样,不过要用字典序从大到小排列之.
1 #!/usr/bin/python 2 3 astring=raw_input("Enter a list of num:") 4 alist=astring.split() 5 print alist 6 7 ilist=[] 8 for s in alist: 9 i=int(s) 10 ilist.append(i) 11 12 print ilist 13 print sorted(ilist) 14 #print ilist.sort() 15 print sorted(alist) 16 #print alist.sort()
6–4.算术. 更新上一章里面你的得分测试练习方案,把测试得分放到一个列表中去.你的代
码应该可以计算出一个平均分,见练习 2-9 和练习 5-3.
1 !/usr/bin/python 2 3 def value(num): 4 if 90<=num<=100: 5 #print 'A' 6 return 'A' 7 elif 80<=num<=89: 8 #print 'B' 9 return 'B' 10 elif 70<=num<=79: 11 #print 'C' 12 return 'C' 13 elif 60<=num<=69: 14 #print 'D' 15 return 'D' 16 elif num>=0 and num<60: 17 #print 'F' 18 return 'F' 19 else: 20 print "The num is invalid." 21 22 23 if __name__=="__main__": 24 vlist=[] 25 ilist=[56,34,78,90,62,81,100] 26 for i in ilist: 27 vlist.append(value(i)) 28 print vlist 29 print sorted(ilist)
6–5.
字符串
(a)更新你在练习 2-7 里面的方案,使之可以每次向前向后都显示一个字符串的一个字符.
(b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者 cmp()内建函数)。附加题:
在你的方案里加入大小写区分.
(c)判断一个字符串是否重现(后面跟前面的一致).附加题:在处理除了严格的回文之外,加入对
例如控制符号和空格的支持。
(d)接受一个字符,在其后面加一个反向的拷贝,构成一个回文字符串.
答:
c
1 #!/usr/bin/python 2 #encoding=utf-8 3 #判断一个字符串是否重现(后面跟前面的一致). 4 #附加题:在处理除了严格的回文之外,加入对例如控制符号和空格的支持。 5 import sys 6 7 def palindorom(s): 8 l=len(s) 9 if l%2<>0: 10 print "The string is not palindorom." 11 else: 12 for i in (0,int((l-1)/2)): 13 if s[i]==s[-(i+1)]: 14 pass 15 else: 16 print "The string is not palindorom." 17 sys.exit() 18 print "The string is a palindorom." 19 20 if __name__=="__main__": 21 astring=raw_input("Enter a string:") 22 palindorom(astring)
d
1 #!/usr/bin/python 2 #encoding:utf-8 3 #接受一个字符,在其后面加一个反向的拷贝,构成一个回文字符串. 4 5 original=raw_input("Enter a string:").strip() 6 length=len(original) 7 palindorom=original 8 for i in range(1,length+1): 9 palindorom=palindorom+original[-i] 10 11 print palindorom
6–6.字符串.创建一个 string.strip()的替代函数:接受一个字符串,去掉它前面和后面的
空格(如果使用 string.*strip()函数那本练习就没有意义了)
1 #!/usr/bin/python 2 #encoding:utf-8 3 #创建一个 string.strip()的替代函数:接受一个字符串,去掉它前面和后面的 4 #空格(如果使用 string.*strip()函数那本练习就没有意义了) 5 6 original=raw_input("Enter a string:") 7 length=len(original) 8 print length 9 for i in range(0,length): 10 if original[i]<>' ': 11 lstrip=original[i:] 12 print len(lstrip) 13 break 14 else: 15 pass 16 17 18 for i in range(1,length+1): 19 if lstrip[-1]<>' ': 20 strip=lstrip 21 break 22 elif lstrip[-i]<>' ': 23 strip=lstrip[:-i+1] 24 print len(strip) 25 break 26 else: 27 pass 28 29 print strip
6–7.调试.看一下在例 6.5 中给出的代码(buggy.py)
(a)研究这段代码并描述这段代码想做什么.在所有的(#)处都要填写你的注释.
(b)这个程序有一个很大的问题,比如输入 6,12,20,30,等它会死掉,实际上它不能处理任何的偶
数,找出原因.
(c)修正(b)中提出的问题.
1 #!/usr/bin/python 2 3 num_str=raw_input("Enter a number:") 4 5 num_num=int(num_str) 6 7 fac_list=range(1,num_num+1) 8 9 print "BEFORE:",fac_list 10 i=0 11 while i<len(fac_list): 12 if num_num % (fac_list[i])==0: 13 del fac_list[i] 14 else: 15 i=i+1 16 17 print "AFTER:",fac_list