python核心编程(第二版)-------第六章课后习题
6-1.字符串。string模块中是否有一种字符串方法或者函数可以帮助我鉴定一下字符串是否是另一个大字符穿的一部分?
答案: 存在一个方法:find(sub, beg, end)
参数解释:(1)sub是要检测的子字符串;
(2)beg是大字符穿中检索时的起始位置,默认值是0;
(3)end是检索时的终止位置,默认是-1
(4)[beg, end]类似于索引切片,最终检索位置不包括end
返回值:(1)如果检索成功,返回sub串出现的位置
(2)如果失败,返回-1
例:>>> s = "xysdls"
>>> s.find("s")
2
>>> s.find("ys")
1
>>> s.find("yd")
-1
6-2. 字符串标识符。修改例6-1的idcheck.py脚本,使之可以检测长度为1的标识符,并且可以识别关键字。对于后一个要求,你可以使用keyword模块(特别是keyword.kelist)来辅助。
代码如下:
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 "idcheck.py -- check the descriptor" 5 6 import string 7 import keyword 8 9 alphas = string.letters + '_' #string.letters返回一个字符串,string.digits也返回一个字符串 10 nums = string.digits 11 alp_nums = alphas + nums 12 keylist = keyword.kwlist 13 14 print "Welcome to the identifier checker 1.0" 15 16 while True: 17 my_choice = raw_input("identifier to test?(Y or N): ") 18 19 if my_choice != "Y" and my_choice != "N": 20 print "please choose Y or N" 21 22 if my_choice == "N": 23 print "thanks for use! goodbye!" 24 break 25 26 if my_choice == "Y": 27 get_input = raw_input("Please enter your identifier: ") 28 length = len(get_input) 29 30 if length == 0: 31 print "Please enter some chars" 32 33 if length == 1: 34 if get_input not in alphas: 35 print "invalid identifier: the first char must be alphabetic" 36 elif get_input in keylist: 37 print "unvalid: It is a keyword" 38 else: 39 print "Okay as an identifier" 40 41 if length > 1: 42 firstchar = get_input[0] 43 otherchar = get_input[1:] 44 45 if get_input in keylist: 46 print "unvalid: It is a keyword" 47 elif firstchar not in alphas: 48 print "invalid: first char must be alphabetic" 49 else: 50 for eachchar in otherchar: 51 if eachchar not in alp_nums: 52 print "invalid: remaining symbols must be alphanumeric" 53 break 54 else: 55 print "Okay as an identifier" 56 print "Done!"
6-3. 排序。
(a)输入一个字符串,并从大到小排序。
(b)跟a一样,不过要用字典序从大到小排序
代码如下:
a. 按大小排序
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 """a 按大小排序""" 5 6 getInput = raw_input("please enter a list of number: ") 7 getInput = getInput.split() 8 9 numL = [] 10 for eachNum in getInput: 11 eachNum = int(eachNum) 12 numL.append(eachNum) 13 14 sortL = sorted(numL, reverse = True) 15 for eachNum in sortL: 16 print eachNum,
b. 按字典序排序
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 """a 按字典序(即ASCII值)排序,sorted对于字符串类型排序用的是字典序""" 5 6 getInput = raw_input("please enter a list of number: ") 7 getInput = getInput.split() 8 9 sortL = sorted(getInput, reverse=True) 10 11 for eachNum in sortL: 12 print eachNum,
6-4. 算数。更新上一章里面你的得分测试练习方案,把测试得分放入一个列表中去,你的代码应该可以计算出一个平均分,见练习2-9和练习5-3.
代码如下:
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 def test(score): 5 if score > 100 or score < 0: 6 return "your input invalid" 7 if 90 <= score <= 100: 8 return "A" 9 if 80 <= score <= 89: 10 return "B" 11 if 70 <= score <= 79: 12 return "C" 13 if 60 <= score <= 69: 14 return "D" 15 if score < 60: 16 return "F" 17 18 def main(): 19 L = [] 20 while True: 21 getInput = raw_input("Please enter your score(press 'q' to quit): ") 22 if getInput == 'q': 23 break 24 getInput = float(getInput) 25 result = test(getInput) 26 if result not in "ABCDF": 27 print result 28 else: 29 print "Your score is %s" % result 30 L.append(getInput) 31 length = len(L) 32 mean = sum(L) / length 33 print "The mean of your input is %.2f" % mean 34 35 if __name__ == '__main__': 36 main()
6-5.字符串。
(a)更新你在2-7里面的方案,使之可以每次向前向后都显示一个字符串的一个字符。
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 """#循环和字符串。从用户那里接受一个输入,然后逐个字符显示该字符串。下一次比前一次多一个字符""" 5 6 get_input = raw_input("please enter a string: ") 7 length = len(get_input) 8 L = range(1, length + 1) 9 for i in L: 10 print get_input[:i] 11 print "It's done!"
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 """#循环和字符串。从用户那里接受一个输入,然后逐个字符显示该字符串。下一次比前一次少一个字符""" 5 6 get_input = raw_input("please enter a string: ") 7 length = len(get_input) 8 L = [None] + range(-1, -length, -1) 9 for i in L: 10 print get_input[:i] 11 print "It's done!"
(b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符和cmp()内建函数)
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 getInput = raw_input("Please enter two string: ") 5 getInput = getInput.split() 6 str1 = getInput[0].lower() 7 str2 = getInput[1].lower() 8 len1 = len(str1) 9 len2 = len(str2) 10 11 if len1 != len2: 12 print "Not equal!" 13 if len1 == len2: 14 L = range(len1) 15 for i in L: 16 if str1[i] != str2[i]: 17 print "Not equal!" 18 break 19 print "equal!"
(c)判断一个字符串是否重现(后面跟前面的一致即是否回文)
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 #判断一个字符串是否重现(后面跟前面的一致) 5 def Palindrome(s): 6 l = len(s) 7 if l < 2: 8 return False 9 10 if l % 2 == 0: 11 end = l / 2 12 else: 13 end = l / 2 + 1 14 15 for i in xrange(end): 16 if s[i] != s[-(i + 1)]: 17 return False 18 else: 19 return True 20 21 def test(): 22 while True: 23 getInput = raw_input("Please enter an string('q' to quit): ") 24 length = len(getInput) 25 if length == 0: 26 print "No input" 27 continue 28 if getInput == 'q': 29 break 30 bl = Palindrome(getInput) 31 if bl: 32 print "The string is a Palindrome" 33 else: 34 print "The string is not a Palindrome" 35 36 if __name__ == '__main__': 37 test()
附加题:在处理了严格回文之外,加入对例如控制符号和空格的支持。
(d)接受一个字符串在其后面加上一个反向的拷贝,构成一个回文字符串
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 #接受一个字符,在其后面加上一个反向拷贝,构成一个回文字符串 5 6 def convert(s): 7 s_1 = s[::-1] 8 return "%s%s" % (s, s_1) 9 10 def test(): 11 while True: 12 getInput = raw_input("Please enter a string: ") 13 length = len(getInput) 14 if length == 0: 15 print "No input" 16 continue 17 if getInput == 'q': 18 break 19 s = convert(getInput) 20 print "The final output is '%s'" % s 21 22 if __name__ == '__main__': 23 test()
6-6.字符串。创建一个strin.strip()的替代函数:接受一个字符串,去掉它前面和后面的空格(如果使用string.*strip()函数,那么本练习就没有意义了)
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 def nstrip(s): 5 length = len(s) 6 L = range(length) 7 for i in L: 8 if s[i] == ' ': 9 pass 10 else: 11 s = s[i:] 12 break 13 length = len(s) 14 L = range(-1, -(length+1), -1) 15 for i in L: 16 if s[i] == ' ': 17 pass 18 else: 19 s = s[-length:i+1] 20 break 21 return s 22 23 def test(): 24 while True: 25 getInput = raw_input("Please enter a string('q' to quit): ") 26 length = len(getInput) 27 if length == 0: 28 print "No input" 29 break 30 if getInput == 'q': 31 break 32 s = nstrip(getInput) 33 print "The final string is '%s'" % s 34 35 if __name__ == '__main__': 36 test()
6-7
1 #/usr/bin/env python 2 #-*-coding: utf-8-*- 3 while True: 4 num_str = raw_input("please input a number" 5 "('q' to quit!): ") 6 if len(num_str) == 0: 7 print "No input!" 8 break 9 if num_str == 'q': 10 print "thanks for use!" 11 break 12 #如果输入的不是数字字符串,那么就报错,并且打印提示信息 13 try: 14 num_num = int(num_str) 15 except Exception, e: 16 print "%s: %s" % (e.__class__.__name__, e) 17 else: 18 fac_list = range(1, num_num + 1) 19 20 print "BEFORE: ", fac_list 21 22 i = 0 23 l = [] 24 while i < len(fac_list): 25 if num_num % fac_list[i] != 0: 26 l.append(fac_list[i]) 27 i += 1 28 fac_list = l 29 print "AFTER: ", fac_list
6-8
1 #/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 def convert_num_to_str(num): 5 if num == 0: 6 return 'zero' 7 if num == 1: 8 return 'one' 9 if num == 2: 10 return 'two' 11 if num == 3: 12 return 'three' 13 if num == 4: 14 return 'four' 15 if num == 5: 16 return 'five' 17 if num == 6: 18 return 'six' 19 if num == 7: 20 return 'seven' 21 if num == 8: 22 return 'eight' 23 if num == 9: 24 return 'nine' 25 26 27 while True: 28 L_num = [] 29 L_str = [] 30 getInput = raw_input("Please enter a number(>= 0 and <= 1000)" 31 "('q' to quit!): ") 32 if len(getInput) == 0: 33 print "No input" 34 break 35 if getInput == 'q': 36 print "thanks for use!" 37 break 38 num = int(getInput) 39 if (num > 1000) or (num < 0): 40 print "Please enter number between 0 and 1000" 41 continue 42 for x in getInput: 43 L_num.append(int(x)) 44 for x in L_num: 45 L_str.append(convert_num_to_str(x)) 46 s = "-".join(L_str) 47 print s
6-10
1 #/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 5 def my_swapcase(S): 6 s = '' 7 for x in S: 8 if not x.isalpha(): 9 s += x 10 elif x.islower(): 11 s += x.upper() 12 elif x.isupper(): 13 s += x.lower() 14 return s 15 16 17 def test(): 18 while True: 19 getInput = raw_input("Please enter a string('q'to quit): ") 20 if getInput == 'q': 21 result = my_swapcase(getInput) 22 print result 23 print "thanks for use!" 24 break 25 if len(getInput) == 0: 26 print "No input" 27 continue 28 result = my_swapcase(getInput) 29 print result 30 31 if __name__ == '__main__': 32 test()
6-11
1 #/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 #IP地址在数据库中以整数形式存储:IP存储的整数与点分十进制有如下关系: 5 #IP: a.b.c.d number:((a*256+b)*256+c)*256+d 6 7 def num_to_ip(num): 8 L = [] 9 for x in xrange(0, 4): 10 L.append(str(num % 256)) 11 num /= 256 12 s = ".".join(L[::-1]) 13 return s 14 15 def ip_to_num(ip): 16 L = ip.split(".") 17 L = [int(j) * (256 ** i) for i, j in enumerate(L[::-1])] 18 num = sum(L) 19 return num 20 21 def test(): 22 while True: 23 getIn = raw_input("Please enter your input('q' to quit!): ") 24 if len(getIn) == 0: 25 print "No input" 26 continue 27 if getIn == 'q': 28 print "thanks for use!" 29 break 30 if '.' not in getIn: 31 print num_to_ip(int(getIn)) 32 else: 33 print ip_to_num(getIn) 34 35 if __name__ == '__main__': 36 test()
6-12
1 #/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 def findchr(string, char): 5 if char not in string: 6 return -1 7 if char in string: 8 for i, j in enumerate(string): 9 if char == j: 10 return i 11 12 def rfindchr(string, char): 13 if char not in string: 14 return -1 15 if char in string: 16 for i, j in enumerate(string[::-1]): 17 if char == j: 18 return len(string) - (i + 1) 19 20 def subchr(string, origchar, newchar): 21 if origchar not in string: 22 return -1 23 if origchar in string: 24 for i, j in enumerate(string): 25 if origchar == j: 26 string = newchar.join( 27 (string[:i], string[i+1:])) 28 return string 29 30 def test(): 31 print findchr("askbdnasfdl", 's') 32 print rfindchr("saklnLKND;SaNK", 'a') 33 print subchr("asbkjbakl", 'a', 's') 34 35 if __name__ == '__main__': 36 test()
6-13
1 #!/usr/bin/env python 2 #-*-coding: utf-8-*- 3 4 def atoc(string): 5 6 if 'j' not in string: 7 return complex(string) 8 9 if string[0] == '-': 10 if '-' in string[1:]: 11 string = string[1:].split("-") 12 string[0] = '-' + string[0] 13 string[1] = '-' + string[1] 14 if '+' in string[1:]: 15 string = string.split("+") 16 if string[0] == '+': 17 if '-' in string[1:]: 18 string = string.split("-") 19 string[1] = '-' + string[1] 20 if '+' in string[1:]: 21 string = string.split("+") 22 if string[0] != '-' and string[0] != '+': 23 if '-' in string: 24 string = string.split("-") 25 string[1] = '-' + string[1] 26 if '+' in string: 27 string = string.split("+") 28 real = float(string[0]) 29 img = float(string[1][:-1]) 30 return complex(real, img) 31 32 33 def test(): 34 while True: 35 getIn = raw_input("Please enter a complex string('q' to quit): ") 36 if len(getIn) == 0: 37 print "No input!" 38 continue 39 if getIn == 'q': 40 print "Thanks for use!" 41 break 42 comp = atoc(getIn) 43 print "The complex is", comp 44 45 if __name__ == '__main__': 46 test()