<Python核心编程(第二版)>第六章练习题

  1. 1. 字符串. string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下字符串是否是另一个大字符串的一部分? 
  2.    in 
  3.  
  4. 2. 字符串标识符. 修改例6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且可以识别 python 关键字. 
  5.    对后一个要求,你可以使用 keyword 模块(特别是 keyword.kwlist) 来辅助. 
  6. #!/usr/bin/env python 
  7. ## -*- coding: UTF-8 -*- 
  8. ## Author: 
  9.  
  10. import string,keyword 
  11.  
  12. alphas = string.letters + '_' 
  13. nums = string.digits 
  14.  
  15. print "Welcome to the Identifier Checker v1.0" 
  16. myInput = raw_input("Identifier to test? "
  17.  
  18. if myInput in keyword.kwlist[:]: 
  19.     print """ invalid: is a keyword """ 
  20. else
  21.     if myInput[0not in alphas: 
  22.         print """ invalid: first symbol must be alphabetic """ 
  23.     else
  24.         for otherChar in myInput[1:]: 
  25.             if otherChar not in alphas + nums: 
  26.                 print """ invalid: remaining symbols must be alphanumeric """ 
  27.                 break 
  28.         else
  29.             print "okay as an identifier" 
  30.  
  31.  
  32. 3. 排序. 
  33.    a). 输入一串数字,并从大到小排列之; 
  34.    b). 跟a一样,不过要用字典序从大到小排列. 
  35. a). 
  36. #!/usr/bin/env python 
  37. ## -*- coding: UTF-8 -*- 
  38. ## Author: 
  39.  
  40. aNumber = raw_input("Please Enter a number,split with ','\n"
  41. nuList = [] 
  42. for anu in aNumber.split(",")[:]: 
  43.     nuList.append(int(anu)) 
  44. nuList.sort(reverse=True
  45. print nuList 
  46.  
  47. b). 
  48. #!/usr/bin/env python 
  49. ## -*- coding: UTF-8 -*- 
  50. ## Author: 
  51.  
  52. def sortDict (aDict): 
  53.     values = aDict.values() 
  54.     values.sort(reverse=True
  55.     print values 
  56.  
  57. if __name__ == "__main__"
  58.     aDict = {'a':1,'d':4,'e':2,'b':3,'c':5,'f':6,'g':7
  59.     sortDict (aDict) 
  60.  
  61.  
  62. 4. 算术. 更新上一章里面你的得分测试练习方案,把测试得分放到一个列表中去.你的代码应该可以计算出一个平均 
  63.    分,见练习 2-9 和 练习 5-3 
  64. #!/usr/bin/env python 
  65. ## -*- coding: UTF-8 -*- 
  66. ## Author: 
  67.  
  68. gradeList = [] 
  69. listSum = 0 
  70.  
  71. while True
  72.     aScore = raw_input("Please Enter your point:\n"
  73.     if aScore == "-1"
  74.         break 
  75.     gradeList.append(float(aScore)) 
  76.     listSum += float(aScore) 
  77.  
  78. print "the average Score is %.2f" % (listSum/len(gradeList)) 
  79.  
  80. 5. 字符串 
  81.    a). 更新你在练习 2-7 里面的方案,使之可以每次向前向后都显示一个字符串的一个字符. 
  82.    b). 通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者cmp()内建函数). 
  83.        附加题: 在你的方案里加入区分大小写. 
  84.    c). 判断一个字符串是否重现(后面跟前面的一致). 附加题: 在处理了严格的回文之外,加入对例如控制符号和空 
  85.        格的支持. 
  86.    d). 接受一个字符, 在其后面加一个反向的拷贝, 构成一个回文字符串. 
  87. a). 
  88. #!/usr/bin/env python 
  89. ## -*- coding: UTF-8 -*- 
  90. ## Author: 
  91.  
  92. if __name__ == "__main__"
  93.     aString = raw_input("Please Enter a String ...\n"
  94.     for lNum in xrange(len(aString)): 
  95.         print "left %d Letter is %s, and right %d Letter is %s" % (lNum,aString[lNum],lNum,aString[::-1][lNum]) 
  96.  
  97. b). 
  98. #!/usr/bin/env python 
  99. ## -*- coding: UTF-8 -*- 
  100. ## Author: 
  101.  
  102. aString = raw_input("Enter a String as string A\n"
  103. bString = raw_input("Enter a String as string B\n"
  104. signBit = 0 
  105. if len(aString) != len(bString): 
  106.     signBit = 1 
  107. else
  108.     for lett in xrange(len(aString)): 
  109.         if aString[lett] != bString[lett]: 
  110.             signBit = 1 
  111.  
  112. if signBit == 1
  113.     print "not the same String ..." 
  114. else
  115.      print "The same String ..." 
  116. #"not the same String ..." if signBit == 1 else "The same String ..." 
  117. c),d)  看不明白题目意思 
  118.  
  119.  
  120. 6. 字符串. 创建一个 string.strip() 的替代函数: 接受一个字符串,去年它前面和后面的空格(如果使用  
  121.    string.*strip()函数, 那本练习就没有意义了) 
  122.  
  123. 着重注意题意是 "去掉前面和后面的空格" 
  124. #!/usr/bin/env python 
  125. ## -*- coding: UTF-8 -*- 
  126. ## Author:  
  127.  
  128. def myStrip(aString): 
  129.     finalString = aString[1:-1
  130.     return finalString 
  131.  
  132. aString = raw_input("Please Enter a String: \n"
  133. if aString.startswith(" "and aString.endswith(" "): 
  134.     print myStrip(aString) 
  135. else
  136.     print "String Must begin and end with space ..." 
  137.  
  138.    
  139. 7. 调试. 看一下在例 6.5 中给出的代码(buggy.py) 
  140. #!/usr/bin/env python 
  141.  
  142. ## 输入一个数字 
  143. num_str = raw_input('Enter a number: '
  144.  
  145. ## 将输入的数字转为字符类型 
  146. num_num = int(num_str) 
  147.  
  148. ## 定义 fac_list 为,以输入的数字作为临界的列表 
  149. fac_list = range(1,num_num+1
  150. print "BEFORE:", fac_list 
  151.  
  152. ## 定义 i 的初始值为 0 
  153. i = 0 
  154.  
  155. ## 以 i 小于列表长度作为循环条件 
  156. while i < len(fac_list): 
  157.  
  158.     ## 当 输入的数字能 被 列表中的元素 整除时, 将其踢除出列表 
  159.     if num_num % fac_list[i] == 0
  160.         del fac_list[i] 
  161.  
  162.     ## i 自加 
  163.     i = i + 1 
  164.  
  165. ## 打印循环处理后的列表 
  166. print "AFTER:",fac_list 
  167.  
  168.    a). 研究这段代码并描述这段代码想做什么. 在所有的(#) 处都要填写你的注释. 
  169.    b). 这个程序有一个很大的问题, 比如输入6,12,20,30等,它会死掉. 实际上它不能处理任何的偶数.找出原因 
  170.    c). 修正 b) 中提出的问题. 
  171.  
  172. b). 应该是不能处理任何数字,程序没有把 fac_list 当成变量,而是当成字符串处理了 
  173. a),c). 见以上代码 
  174.  
  175.  
  176. 8. 列表. 给出一个整型值, 返回代表该值的英文, 比如输入 89 返回 "eight-nine". 附加题:能够返回符合英文 
  177.    语法规则的形式,比如输入 输入 89 返回 "eighty-nine". 本练习中的值限定在0-1000. 
  178. #!/usr/bin/env python 
  179. ## -*- coding: UTF-8 -*- 
  180. ## Author: 
  181. myRule = {0:'zero',1:'one',2:'two',3:'three',4:'four',5:'five',6:'six',7:'seven',8:'eight',9:'nine',10:'ten',11:'eleven',12:'twelve',13:'thirteen',14:'fourteen',15:'fifteen',16:'sixteen',17:'seventeen',18:'eighteen',19:'nineteen',20:'twenty',30:'thirty',40:'forty',50:'fifty',60:'sixty',70:'seventy',80:'eighty',90:'ninety',100:'hundred',1000:'thousand'
  182. def convNu2En (number): 
  183.     convNu = "" 
  184.     number = int(number) 
  185.     if number <= 19
  186.         convNu = myRule[number] 
  187.         return convNu 
  188.     elif number < 100
  189.         convNu = myRule[number // 10 * 10
  190.         unit = convNu2En(str(number)[-1]) 
  191.         convNu += "-" + unit 
  192.         #convNu = convNu + "-" + unit 
  193.         return convNu 
  194.     else
  195.         bits = len(str(number)) - 1 
  196.         if bits <= 2
  197.             bits = 2 
  198.         elif bits <= 3
  199.             bits = 3 
  200.         firstBit = 10 ** bits 
  201.         convNu = convNu2En(str(number)[:-bits]) + " " + myRule[firstBit] 
  202.         otherBit = convNu2En(str(number)[-bits:]) 
  203.         if bits == 2
  204.             convNu += " and " 
  205.         else
  206.             convNu += "," 
  207.         convNu += otherBit 
  208.     return convNu 
  209.  
  210. if __name__ == "__main__"
  211.     import sys 
  212.     number = sys.argv[1
  213.     print convNu2En (number) 
  214.  
  215.  
  216. 9. 转换. 为练习 5-13 写一个姐妹函数, 接受分钟数, 返回小时数和分钟数. 总时间不变,并且要求小时数尽可能大. 
  217. #!/usr/bin/env python 
  218. ## -*- coding: UTF-8 -*- 
  219. ## Author: 
  220.  
  221. mins = int(raw_input("Enter a Number: \n")) 
  222. print "%d%s%d" % (divmod(mins,60)[0],":",divmod(mins,60)[1]) 
  223.  
  224.  
  225. 10. 字符串. 写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转. 比如,输入 "Mr.Ed", 应该 
  226.     返回 "mR.eD" 作为输出. 
  227. #!/usr/bin/env python 
  228. ## -*- coding: UTF-8 -*- 
  229. ## Author: 
  230.  
  231. myString = raw_input("Enter a String: \n"
  232. for lett in xrange(len(myString)): 
  233.     if myString[lett].isupper(): 
  234.         myString = "%s%s%s" % (myString[:lett],myString[lett].lower(),myString[lett+1:]) 
  235.     elif myString[lett].islower(): 
  236.         myString = "%s%s%s" % (myString[:lett],myString[lett].upper(),myString[lett+1:]) 
  237.     else
  238.         pass 
  239. print myString 
  240.  
  241. 发现有这么一个东东 swapcase(...), 专门实现这个功能,代码简洁多了 
  242. #!/usr/bin/env python 
  243. ## -*- coding: UTF-8 -*- 
  244.  
  245. def myChang(myString): 
  246.     return myString.swapcase() 
  247.  
  248. myString = raw_input("Enter a String: \n"
  249. print myChang(myString) 
  250.  
  251.  
  252. 11. 转换. 
  253.     a). 创建一个从整型到IP地址的转换程序,如下格式: WWW.XXX.YYY.ZZZ  
  254.     b). 更新你的程序,使之可以逆转转换. 
  255. #!/usr/bin/env python 
  256. ## -*- coding: UTF-8 -*- 
  257. ## Author: 
  258.  
  259. def int2ip(myNumber): 
  260.     dotBitIP = '' 
  261.     for dotBit in xrange(3,-1,-1): 
  262.         dotBitIP = dotBitIP + str(myNumber / (256 ** dotBit)) + "." 
  263.         if dotBit == 3 and int(dotBitIP.rstrip('.')) > 255
  264.             print "Invalid IP,please enter another number ..." 
  265.             sys.exit(1
  266.         #print dotBit,dotBitIP 
  267.         myNumber = myNumber % (256 ** dotBit) 
  268.     return(dotBitIP.rstrip('.')) 
  269.  
  270. if __name__ == "__main__"
  271.     import sys 
  272.     myNumber = int(sys.argv[1]) 
  273.     print int2ip (myNumber) 
  274.  
  275.  
  276. 12. 字符串. 
  277.     a). 创建一个名字为 findchr() 的函数, 函数声明如下: 
  278.         def findchr(string, char) 
  279.     findchr() 要在字符串 string 中查找字符 char, 找到就返回该值的索引,否则返回-1. 不能用string.*find() 
  280.     或者 string.*index() 函数和方法. 
  281.     b). 创建另一个叫 rfindchr() 的函数,查找字符 char 最后一次出现的位置. 它跟findchr() 工作类似,不过它是 
  282.         从字符串的最后开始向前查找的. 
  283.     c). 创建第三个函数, 名字叫做 subchr(), 声明如下: 
  284.         def subchr(string, origchar, newchar) 
  285.     subchr() 跟 findchr() 类似, 不同的是, 如果找到匹配的字符就用新的字符替换原先字符.返回修改后的字符. 
  286. a). 
  287. #!/usr/bin/env python 
  288. ## -*- coding: UTF-8 -*- 
  289. ## Author: 
  290.  
  291. def findchr (aString,myChar): 
  292.     if myChar not in aString: 
  293.         print "-1" 
  294.     else
  295.         charLength = len(myChar) 
  296.         i = 0 
  297.         while i < len(aString): 
  298.             if aString[i:i+charLength] == myChar: 
  299.                 print i 
  300.             i += 1 
  301. if __name__ == "__main__"
  302.     aString = raw_input('Please Enter a string ... '
  303.     myChar = raw_input('Please Enter a string or char ... '
  304.     findchr(aString, myChar) 
  305. b). 
  306. #!/usr/bin/env python 
  307. ## -*- coding: UTF-8 -*- 
  308. ## Author: 
  309.  
  310. def findchr (aString,myChar): 
  311.     if myChar not in aString: 
  312.         print "-1" 
  313.     else
  314.         charLength = len(myChar) 
  315.         i = 0 
  316.         resultList = [] 
  317.         while i < len(aString): 
  318.             if aString[i:i+charLength] == myChar: 
  319.                 resultList.append(i) 
  320.             i += 1 
  321.         print "last appear @ %d" % resultList[-1
  322. if __name__ == "__main__"
  323.     aString = raw_input("Enter a string ... "
  324.     myChar = raw_input("Enter a string or char ... "
  325.     findchr(aString, myChar) 
  326. c). 
  327. #!/usr/bin/env python 
  328. ## -*- coding: UTF -*- 
  329. ## Author: 
  330.  
  331. def subchr(myString,origChar,newChar): 
  332.     if origChar not in myString: 
  333.         print "-1" 
  334.     else
  335.         print myString.replace(origChar,newChar) 
  336.  
  337. if __name__ == "__main__"
  338.     myString = raw_input("Enter a string ..."
  339.     origChar = raw_input("Enter a string or char will be replaced ..."
  340.     newChar = raw_input("Enter a string or char to relace ..."
  341.     subchr(myString,origChar,newChar) 
  342.  
  343.  
  344. 13. 字符串 .string 模块包含三个函数, atoi(), atol() 和 atof(),它们分别负责把字符串转换成整型,长整型和浮点 
  345.     型数字. 从Python1.5 起,Python 的内建函数 int(),long(),float() 也可以做相同的事了, complex()函数可以把 
  346.     字符串转换成复数(然而 1.5 之前,这些转换函数只能工作于数字之上.) 
  347.     string 模块中并没有实现一个 atoc() 函数, 那么你来实现一个atoc(),接受单个字符串做参数输入,一个表示复数 
  348.     的字符串,例如'-1.23e+4-5.67j',  返回相应的复数对象.你不能用 eval() 函数,但可以使用 complex() 函数,而且你只 
  349.     能在如下的限制之下使用: complex():complex(real,imag) 的 real 和 imag 都必须是浮点值. 
  350.  
  351.  
  352. 14. 随机数. 设计一个"石头,剪子,布"游戏,有时又叫"Rochambeau", 你小时候可能玩过,下面是规则. 你和你的对手, 在同一 
  353.     时间做出特定的手势,必须是下面一种: 石头,剪子,布. 胜利者从下面规则中产生,这个规则本身是个悖论. 
  354.     a). 布 包 石头; 
  355.     b). 石头 砸 剪子 
  356.     c). 剪子 剪破 布. 
  357.     在你的计算机版本中, 用户输入她/他的选项, 计算机找一个随机选项,然后由你的程序来决定一个胜利者或者平手. 
  358.     注意: 最好的算法是尽量少的使用if语句. 
  359.  
  360. #!/usr/bin/env python 
  361. ## -*- coding: UTF-8 -*- 
  362. ## Author: 
  363.  
  364. import random 
  365.  
  366. player = {1:'stone',2:'scissors',3:'cloth'
  367. judge = {('stone','scissors'): 'Win',('stone','cloth'): 'Lose',('stone','stone'): 'draw',('scissors','cloth'): 'Win',('scissors','stone'):'Lose',('scissors'
  368. 'scissors'):'draw',('cloth','stone'):'Win',('cloth','scissors'):'Lose',('cloth','cloth'):'draw',} 
  369.  
  370. def gStart (): 
  371.     pcChoice = player[random.choice(range(1,3))] 
  372.     print player,"Please choose ..." 
  373.     myChoice = player[int(raw_input('Enter Your choice>:'))] 
  374.  
  375.     print "Your choice is \033[1;31;32m%s\033[0m, Computer's choice is \033[1;31;32m%s\033[0m, and you \033[1;31;31m%s\033[0m" % (myChoice,pcChoice,judge[myC 
  376. hoice,pcChoice]) 
  377.  
  378. def main(): 
  379.     while True
  380.         gStart () 
  381.         try
  382.             goAgain = raw_input("Start again ?[y/n]").lower() 
  383.             if goAgain and goAgain[0] == "n"
  384.                 break 
  385.         except (KeyboardInterrupt,EOFError): 
  386.             break 
  387.  
  388. if __name__ == "__main__"
  389.     main() 
  390.  
  391.  
  392. 15. 转换. 
  393.     a). 给出两个可识别格式的日期, 比如MM/DD/YY 或者 DD/MM/YY 格式, 计算出两个日期间的天数. 
  394.     b). 给出一个人的生日, 计算从此人出生到现在的天数,包括所有的闰月. 
  395.     c). 还是上面的例子,计算出此人下次过生日还有多少天. 
  396. a). 
  397. #!/usr/bin/env python 
  398. ## -*- coding: UTF-8 -*- 
  399. ## Author: 
  400.  
  401. def convertDate (allDate): 
  402.     aYear = int(allDate.split("/")[-1]) 
  403.     aMonth = int(allDate.split("/")[0]) 
  404.     aDay = int(allDate.split("/")[1]) 
  405.     return (aYear,aMonth,aDay) 
  406.  
  407. if __name__ == "__main__"
  408.     import datetime 
  409.     Dt = raw_input("Enter a date ...\n"
  410.     D1 = datetime.date(convertDate(Dt)[0],convertDate(Dt)[1],convertDate(Dt)[2]) 
  411.     Dt = raw_input("Enter another date ...\n"
  412.     D2 = datetime.date(convertDate(Dt)[0],convertDate(Dt)[1],convertDate(Dt)[2]) 
  413.     print (D2 - D1).days 
  414. b). 
  415. #!/usr/bin/env python 
  416. ## -*- coding: UTF-8 -*- 
  417. ## Author: 
  418.  
  419. def convertDate (allDate): 
  420.     aYear = int(allDate.split("/")[-1]) 
  421.     aMonth = int(allDate.split("/")[0]) 
  422.     aDay = int(allDate.split("/")[1]) 
  423.     return (aYear,aMonth,aDay) 
  424.  
  425. if __name__ == "__main__"
  426.     import datetime 
  427.     birthTime = raw_input("Enter Your borth date ...\n"
  428.     D1 = datetime.date(convertDate(birthTime)[0],convertDate(bothTime)[1],convertDate(birthTime)[2]) 
  429.     print (datetime.date.today() - D1).days 
  430. c). 
  431. #!/usr/bin/env python 
  432. ## -*- coding: UTF-8 -*- 
  433. ## Author: 
  434.  
  435. def convertDate (allDate): 
  436.     aYear = int(allDate.split("/")[-1]) 
  437.     aMonth = int(allDate.split("/")[0]) 
  438.     aDay = int(allDate.split("/")[1]) 
  439.     return (aYear,aMonth,aDay) 
  440.  
  441. if __name__ == "__main__"
  442.     import datetime,time 
  443.     birthTime = raw_input("Enter Your borth date ...\n"
  444.     if convertDate(birthTime)[1] > int(time.strftime('%m')): 
  445.         nextBirth = datetime.date(int(time.strftime('%Y')),convertDate(birthTime)[1],convertDate(birthTime)[2]) 
  446.     elif convertDate(birthTime)[1] == int(time.strftime('%m')): 
  447.         if convertDate(birthTime)[2] > int(time.strftime('%d')): 
  448.             nextBirth = datetime.date(int(time.strftime('%Y')),convertDate(birthTime)[1],convertDate(birthTime)[2]) 
  449.         else
  450.             nextBirth = datetime.date(int(time.strftime('%Y')) + 1,convertDate(birthTime)[1],convertDate(birthTime)[2]) 
  451.     else
  452.         nextBirth = datetime.date(int(time.strftime('%Y')) + 1,convertDate(birthTime)[1],convertDate(birthTime)[2]) 
  453.     print (nextBirth - datetime.date.today()).days 
  454.  
  455.  
  456. 16. 矩阵. 处理矩阵 M 和 N 的加和乘操作. 
  457.  
  458.  
  459.  
  460.   
  461. 17. 方法. 实现一个叫 myPop() 函数,功能类似于列表的 pop() 方法, 用一个列表作为输入,移除列表的最新一个元素, 
  462.     并返回它. 
  463. #!/usr/bin/env python 
  464. ## -*- coding: UTF-8 -*- 
  465. ## Author: 
  466. aList = [] 
  467.  
  468. def myPop (): 
  469.     if len(aList) == 0
  470.         print "You can't pop from an empty list ..." 
  471.     else
  472.         dEle = aList[-1
  473.         #aList = aList[:-1] 
  474.         print "Removed [",dEle,"]" 
  475.         aList.remove(dEle) 
  476.         #return aList[:-1] 
  477.  
  478. def addEle (): 
  479.     aList.append(raw_input("Enter a String ...").strip()) 
  480.  
  481. def viewList (): 
  482.     print aList 
  483.  
  484. actions = { 'a':addEle, 'v':viewList, 'd':myPop } 
  485.  
  486. def theMenu (): 
  487.     mBanner = """ 
  488.     (A)dd ele 
  489.     (V)iew ele 
  490.     (D)el ele 
  491.     (Q)uit 
  492.     Enter your choice:  """ 
  493.     while True
  494.         try
  495.             yChoice = raw_input(mBanner).strip()[0].lower() 
  496.         except (EOFError,KeyboardInterrupt,IndexError): 
  497.             yChoice = "q" 
  498.         print "\nYou picked [%s]" % yChoice 
  499.         if yChoice not in 'avdq'
  500.             print "Invalid choice,try again ..." 
  501.         if yChoice == "q"
  502.             break 
  503.  
  504.         actions[yChoice]() 
  505. if __name__ == "__main__"
  506.     theMenu () 
  507.  
  508.  
  509. 18. zip() 内建函数. 在 6.13.2 节里面关于zip() 函数的例子中, zip(fn,ln) 返回的是什么? 
  510. #!/usr/bin/env python 
  511. ## -*- UTF-8 -*- 
  512. ## Author: 
  513.  
  514. fn = ['ian','stuart','david'
  515. ln = ['bairnson','elliott','paton'
  516.  
  517. for i,j in zip(fn,ln): 
  518.     print ("%s %s" % (i,j)).title() 
  519.  
  520.  
  521. 19. 多列输出. 有任意项的序列或者其他容器, 把它们等距离分列显示. 由调用者提供数据和输出格式. 例如, 如果你 
  522.     你传入 100 个项并定义3列输出, 按照需要的模式显示这些数据. 这种情况下,应该是两列显示33个项,最后一列 
  523.     显示34个. 你可以让用户选择水平排序或者垂直排序. 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值