6-2. 字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 keyword.kelist)来辅助
1 import string 2 import keyword 3 4 alphas = string.ascii_letters + '_' 5 nums = string.digits 6 aplpnums = alphas+nums 7 8 print('Testees must be at least 1 chars long.') 9 myInput = input('Identifier to test? ') 10 11 if len(myInput) >= 1: 12 13 if myInput[0] not in alphas: 14 print('invalid: first symbol must be alphabetic') 15 16 else: 17 for otherChar in myInput[1:]: 18 19 if otherChar not in aplpnums: 20 print('''invalid: remaining symbols must be alphanumeric''') 21 break 22 23 else: 24 if myInput in keyword.kwlist: 25 print('invalid: symbol is reseved as keyword') 26 else: 27 print("okay as an identifier")
6-3.排序
(a) 输入一串数字,从大到小排列之.
(b) 跟 a 一样,不过要用字典序从大到小排列
1 nums = [] 2 numbers = input('输入数字: ') 3 for i in numbers: 4 nums.append(int(i)) 5 print(sorted(nums))
6–4.算术. 更新上一章里面你的得分测试练习方案,把测试得分放到一个列表中去.你的代
码应该可以计算出一个平均分,见练习 2-9 和练习 5-3.
1 def grade(fraction): 2 fractions = [90, 80, 70, 60, 0] 3 score = ['A', 'B', 'C', 'D', 'F'] 4 for i in range(len(fractions)): 5 if fraction >= fractions[i]: 6 return score[i] 7 8 if __name__ == '__main__': 9 fraction = int(input('输入成绩:')) 10 print(grade(fraction))
6–5.
字符串
(a)更新你在练习 2-7 里面的方案,使之可以每次向前向后都显示一个字符串的一个字符.
(b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者 cmp()内建函数)。附加题:
在你的方案里加入大小写区分.
(c)判断一个字符串是否重现(后面跟前面的一致).附加题:在处理除了严格的回文之外,加入对
例如控制符号和空格的支持。
(d)接受一个字符,在其后面加一个反向的拷贝,构成一个回文字符串.
1 #(a) 2 str = input("Str: ") 3 for i in str: 4 print(i) 5 6 for i in str[::-1]: 7 print(i) 8 9 #(b) 10 str1 = input('Str1: ').strip() 11 str2 = input('Str2: ').strip() 12 13 if str1 is str2: 14 print('yes') 15 else: 16 print(None) 17 18 #(c) 19 def string(str): 20 if len(str) % 2 != 0: 21 return None 22 else: 23 if str[0] == str[-1]: 24 return str 25 else: 26 return None 27 28 if __name__ == '__main__': 29 str = input('Str: ') 30 print(string(str)) 31 32 #(d) 33 def copy(str): 34 35 str_copy = str[::-1] 36 return str,str_copy 37 38 str = input("Str: ") 39 print(copy(str))
6–6.字符串.创建一个 string.strip()的替代函数:接受一个字符串,去掉它前面和后面的
空格(如果使用 string.*strip()函数那本练习就没有意义了)
1 str = input('Str: ') 2 3 length = len(str) 4 print(length) 5 for i in range(0,length): 6 if str[i] != ' ': 7 str = str[i:] 8 print(len(str)) 9 break 10 else: 11 pass 12 13 for i in range(1, length+1): 14 if str[-1] != ' ': 15 str = str[:] 16 print(len(str)) 17 break 18 elif str[-i] != ' ': 19 str = str[:-i+1] 20 print(len(str)) 21 break 22 else: 23 pass 24 25 print(str)
6-8 列表。给出一个整型值,返回代表该值得英文,比如输入89会返回“eight-nine”。
附加题:能够返回符合英文语法规律的新式,比如输入89会返回“eighty-nine”。本练习中的值假定在0~1000。
# 用列表过于头痛,最后放弃使用字典了
1 numdict = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 2 9: 'nine', 10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 3 16: 'sixteen', 17:'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty', 30: 'thirty', 40: 'forty', 4 50: 'fifty', 60: 'sixty', 70: 'seventy', 80: 'eighty', 90: 'ninety',100: 'one hundred', 200: 'two hundred', 5 300: 'three hundred', 400: 'four hundred', 500: 'five hundred', 600: 'six hundred', 700: 'seven hundred', 6 800: 'eight hundred', 900: 'nine hundred'} 7 8 def twonum(number): 9 if int(number) < 20: 10 return numdict[int(number)] 11 12 elif int(number) > 20 and int(number) % 10 !=0: 13 ten = numdict[int(number[0])*10] 14 one = numdict[int(number[1])] 15 return "%s-%s" % (ten, one) 16 17 return numdict[int(number)] 18 19 def threenum(number): 20 if int(number) % 100 != 0: 21 hundred = numdict[int(number[0])*100] 22 23 if int(number[1:]) < 20: 24 return "%s-%s" % (hundred,numdict[int(number[1:])]) 25 26 elif int(number[1:]) > 20 and int(number[1:]) % 10 !=0: 27 ten = numdict[int(number[1])*10] 28 one = numdict[int(number[2])] 29 return "%s-%s-%s" % (hundred, ten, one) 30 31 return "%s-%s" % (hundred, numdict[int(number[1:])]) 32 33 return numdict[int(number)] 34 35 if __name__ == '__main__': 36 number = input("输入数字: ") 37 if len(number) <= 2: 38 print(twonum(number)) 39 else: 40 print(threenum(number))
6-9 转换。为练习5-13写一个姊妹函数,接受分钟数,返回小时数和分钟数。总时间不变,并且要求小时尽可能大。
1 def time(mins): 2 3 hour = mins // 60 4 minute = mins % 60 5 return '%d:%d' % (hour,minute) 6 7 if __name__ == '__main__': 8 minutes = int(input("输入分钟数: ")) 9 print(time(minutes))
6-10 字符串。写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转,比如,输入“Mr.Ed”,应该返回“mR.eD”作为输出。
1 def swapcase(str): 2 return str.swapcase() 3 4 if __name__ == '__main__': 5 str = input("Str: ") 6 print(swapcase(str))
6-11 转换。
(a)创建一个从整型到IP地址的转换,如下格式:www.xxx.yyy.zzz。
(b)更新你的程序,使之可以逆转换。
1 def iptransfer(ipaddress): 2 """输入整型转换成www.xxx.yyy.zzz格式""" 3 transferedIP = [] 4 if len(ipaddress) != 12: 5 return "输入有误" 6 else: 7 for i in range(len(ipaddress) // 3): 8 transfer, ipaddress = ipaddress[:3], ipaddress[3:] 9 transferedIP.append(transfer) 10 return '.'.join(transferedIP) 11 12 def ipreverse(ipaddress): 13 if len(ipaddress) != 15: 14 return "输入有误" 15 else: 16 ipaddress = list(ipaddress) 17 for ch in ipaddress: 18 if ch == '.': 19 ipaddress.remove(ch) 20 return ''.join(ipaddress) 21 22 if __name__ == '__main__': 23 ip = input('输入IP: ') 24 print(iptransfer(ip)) 25 print(ipreverse(ip))
6-12 字符串。
(a)创建一个名字为findchr()的函数,函数声明如下。
def findchr(string, char)
findchr()要在字符串string中查找字符char,找到就返回该值得索引,否则返回-1。不能用string.*find()或者string.*index()函数和方法。
(b)创建另一个叫rfindchr()的函数,查找字符char最后一次出现的位置。它跟findchr()工作类似,不过它是从字符串的最后开始向前查找的。
(c)创建第三个函数,名字叫subchr(),声明如下。
def subchr(string, origchar, newchar)
subchr()跟findchr()类似,不同的是,如果找到匹配的字符就用新的字符替换原先字符。返回修改后的字符串。
1 def findchr(string, char): 2 3 for i in range(len(string)): 4 if string[i] == char: 5 return i 6 return -1 7 8 def rfindchr(string, char): 9 for i in range(len(string)-1, -1, -1): 10 if string[i] == char: 11 return i 12 return -1 13 14 def subchr(string, origchar, newchar): 15 stringlist = list(string) 16 for i in range(len(string)): 17 if stringlist[i] == origchar: 18 stringlist[i] = newchar 19 return ''.join(stringlist) 20 return -1 21 22 if __name__ == '__main__': 23 string = input("String: ") 24 char = input("Char: ") 25 print(findchr(string, char)) 26 print(rfindchr(string, char)) 27 newchar = input("Newchar: ") 28 print(subchr(string, char, newchar))
6-14 随机数。设计一个“石头、剪子、布”游戏,有时又叫“Rochambeau”,你小时候可能玩过,下面是规则。你和你的对手,
在同一时间做出特定的手势,必须是下面一种:石头、剪子、布。胜利者从下面的规则产生,这个规则本身是个悖论。
(a)布包石头。(b)石头砸剪子。(c)剪子剪破布。在你的计算机版本中,用户输入他/她的选项,计算机找一个随机选项,
然后由你的程序来决定一个胜利者或者平手。注意,最好的算法是尽量少使用if语句
1 import random 2 3 print(''' 4 0 石头 5 1 剪刀 6 2 布 7 3 quit''') 8 list = ['石头', '剪刀', '布'] 9 while True: 10 i = int(input('输入数字: ')) 11 if i == 3: 12 break 13 elif (i < 0 or i > 3): 14 continue 15 c = random.randint(0, 2) 16 if i == c: 17 print('我:', list[i], '电脑:', list[c]) 18 print('平手') 19 elif i - c == 2 or i - c == -1: 20 print('我:', list[i], '电脑:', list[c]) 21 print('赢') 22 else: 23 print('我:', list[i], '电脑:', list[c]) 24 print('输')
6-17 方法。实现一个叫myPop()的函数,功能类似于列表的pop()方法,用一个列表作为输入,移除列表的最新一个元素,并返回它。
1 def myPop(pop): 2 3 element = [] 4 element.append(pop[len(pop)-1]) 5 pop = pop[:(len(pop)-1)] 6 return pop,element 7 8 if __name__ == '__main__': 9 pop = [1, 2, 3, 4, 5] 10 print(myPop(pop))