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

  1. 1. 条件语句. 请看下边代码: 
  2. # statement A 
  3. if x > 0
  4.     # statement B 
  5.     pass 
  6. elif x < 0
  7.     # statement C 
  8.     pass 
  9. else
  10.     # statement D 
  11.     pass 
  12. # statement E 
  13. a) 如果x<0,上面哪个语句(A,B,C,D,E)将被执行? 
  14. b) 如果x==0,上面哪个语句将被执行? 
  15. c) 如果x>0,上面哪个语句将被执行? 
  16. C, D, B 
  17.  
  18.  
  19. 2. 循环. 编写一个程序,让用户输入3个数字:(f)rom,(t)o和(i)ncrement. 以i为步长,从 
  20.    f计数到t,包括f和t. 例如,如果输入的是f==2,t==26,i==4,程序将输出2,6,10,14,18
  21.    22,26. 
  22. range(f,t,i) 
  23.  
  24.  
  25. 3. range(). 如果我们需要生成下面的这些列表,分别需要在range()内建函数中提供哪些 
  26.    参数? 
  27.    a) [0,1,2,3,4,5,6,7,8,9
  28.    b) [3,6,9,12,15,18
  29.    c) [-20,200,420,640,860
  30. a) range(10
  31. b) range(3,20,3
  32. c) range(-20,861,220
  33.  
  34.  
  35. 4. 素数. 我们在本章已经给出了一些代码来确定一个数字的最大约数或者它是否是一个素 
  36.    数. 请把相关代码转换为一个返回值为布尔值的函数,函数名为isprime(). 如果输入的 
  37.    是一个素数,那么返回True,否则返回False
  38. #!/usr/bin/env python 
  39. ## -*- coding: utf-8 -*- 
  40. ## Author:  
  41.  
  42. def isprime(num): 
  43.     count = num / 2 
  44.     while count > 1
  45.         if num % count == 0
  46.             #print "largest factor of %d is %d" % (num,count) 
  47.             return False 
  48.             break 
  49.         count -= 1 
  50.     else
  51.     #    print num, "is prime" 
  52.         return True 
  53.  
  54. for eachNum in range(10,21): 
  55.     print isprime(eachNum) 
  56.  
  57.  
  58. 5. 约数. 完成一个名为getfactors()的函数.它接受一个整型作为参数,返回它所有约数的 
  59.    列表,包括1和它本身. 
  60. def getfactors(number): 
  61.     factorList = [] 
  62.     for i in range(1, number + 1): 
  63.         if number % i == 0 and isprime(i): 
  64.             factorList.append(i) 
  65.     return factorList 
  66.  
  67. def getfactors(number): 
  68.     fList = [1,number] 
  69.     for i in range(1,number + 1): 
  70.         if number % 2 == 0
  71.             fList.append(2
  72.             number = number / 2 
  73.         else
  74.             fList.append(number) 
  75.             break 
  76.     return fList 
  77.  
  78. 6. 素因子分解. 以刚才练习中的isprime()和getfactors()函数为基础编写一个函数,它接受 
  79.    一个整型作为参数,返回该整型所有素数因子的列表.这个过程叫做求素因子分解,它输出 
  80.    的所有因子之积应该是原来的数.注意列表里可能有重复的元素.例如输入20,返回结果应该 
  81.    是[2,2,5]. 
  82. #!/usr/bin/env python 
  83. ## -*- coding: utf-8 -*- 
  84. ## Author: 
  85.  
  86. def isprime(num): 
  87.     count = num / 2 
  88.     while count > 1
  89.         if num % count == 0
  90.             #print "largest factor of %d is %d" % (num,count) 
  91.             return False 
  92.             break 
  93.         count -= 1 
  94.     else
  95.     #    print num, "is prime" 
  96.         return True 
  97.  
  98. def getfactors(number): 
  99.     fList = [1
  100.     for i in range(1,number + 1): 
  101.         if number % 2 == 0
  102.             fList.append(2
  103.             number = number / 2 
  104.         else
  105.             fList.append(number) 
  106.             break 
  107.     return fList 
  108.  
  109. number = int(raw_input("Enter a number:")) 
  110. if isprime(number): 
  111.     print "You Entered a prime..." 
  112. else
  113.     print getfactors(number) 
  114.  
  115.  
  116. 7. 完全数. 完全数被定义为这样的数字: 它的约数(不包括它自己)之和为它本身.例如:6的约 
  117.    数是1,2,3, 因为1+2+3=6,所以6被认为是一个完全数.编写一个名为isperfect()的函数,它 
  118.    接受一个整型作为参数,如果这个数字是完全数,返回1;否则返回0. 
  119. #!/usr/bin/env python 
  120. ## -*- coding: utf-8 -*- 
  121. ## Author: 
  122.  
  123. def getfactors(number): 
  124.     fList = [1
  125.     for i in range(1,number + 1): 
  126.         if number % 2 == 0
  127.             fList.append(2
  128.             number = number / 2 
  129.         else
  130.             fList.append(number) 
  131.             break 
  132.     return fList 
  133.  
  134. def isperfect(number): 
  135.     if  sum(getfactors(number)) == number: 
  136.        return 1 
  137.     else
  138.         return 0 
  139.  
  140. number = int(raw_input("Enter a number:")) 
  141. print isperfect(number) 
  142.  
  143.  
  144. 8. 阶乘. 一个数的阶乘被定义为从1到该数字所有数字的乘积. N的阶乘简写为N!. 
  145.    N! == factorial(N) == 1*2*3*...*(N-2)*(N-1)*N,所以, 
  146.    4! == 1 * 2 * 3 * 4,写一个函数,指定N,返回N!的值. 
  147. #!/usr/bin/env python 
  148. ## -*- coding: utf-8 -*- 
  149. ## Author: 
  150.  
  151. def isfactorial(number): 
  152.     return reduce(lambda x,y:x*y,range(1,number + 1)) 
  153.  
  154. number = int(raw_input("Enter a number:")) 
  155. print isfactorial(number) 
  156.  
  157.  
  158. 9. 斐波那契数列.  斐波那契数列形如1,1,2,3,5,8,13,21,等等. 也就是说,下一个值是序列 
  159.    中前两个值之和. 写一个函数,给定N,返回第N个斐波那契数字.例如,第1个斐波那契数字 
  160.    是1,第6个是8. 
  161. #!/usr/bin/env python 
  162. ## -*- coding: utf-8 -*- 
  163. ## Author: 
  164.  
  165. def fibonacci(x): 
  166.     fibList = [1,1
  167.     for i in xrange(2,x+1): 
  168.         fibList.append(fibList[i-2] + fibList[i-1]) 
  169.     return fibList[-1
  170.  
  171. num = int(raw_input("Enter a numer:")) 
  172. print fibonacci(num) 
  173.  
  174.  
  175. 10. 文本处理. 统计一句话中的元音,辅音及单词(以空格分割)的个数.忽略元音和辅音的特 
  176.     殊情况,如"h","y","qu"等. 附加题:编写处理这些特殊情况的代码. 
  177. #!/usr/bin/env python 
  178. ## -*- coding: utf-8 -*- 
  179. ## Author:  
  180.  
  181. def f(sentence): 
  182.     vChar,vowel,word,consonant = "aeiou",0,0,0 
  183.     for eChar in sentence: 
  184.         if eChar.isalpha(): 
  185.             if eChar in vChar: 
  186.                 vowel += 1 
  187.             else
  188.                 consonant += 1 
  189.  
  190.     return (vowel,consonant,len([eWord for eWord in sentence.split()])) 
  191.  
  192. sentence = raw_input("Input a Sentence...\n"
  193. print "vowel: %d,  consonant: %d,  word: %d" % f(sentence) 
  194.  
  195.  
  196. 11. 文本处理. 要求输入一个姓名列表,输入格式是"LastName,FirstName",即姓 逗号 名.编 
  197.     写程序处理输入,如果用户输入错误,比如"FirstName LastName,",请纠正这些错误,并通 
  198.     知用户.同时你还需要记录输入错误次数.当用户输入结束后,给列表排序,然后以"姓,名" 
  199.     的顺序显示. 
  200.     输入输出示例(你不需要完全按照这里的例子完成): 
  201. %nametrack.py 
  202. Enter total number of names:5 
  203. Please enter name0:Smith,Joe 
  204. Please enter name1:Mary Wong 
  205. >>Wrong format... should be Last,First. 
  206. >>You have done this 1 time(s) already. Fixing input... 
  207. Please enter name2:Hamilton,Gerald 
  208. Please enter name3:Royce,Linda 
  209. Please enter name4:Winston Salem 
  210. >>Wrong format... should be Last,First. 
  211. >>You have done this 2 time(s) already. Fixing input... 
  212. The sorted list(by last name) is
  213.    Hamilton,Gerald 
  214.    Royce,Linda 
  215.    Salem,Winston 
  216.    Smith,Joe 
  217.    Wong,Mary 
  218. -------------------------------------------------------------------- 
  219. #!/usr/bin/env python 
  220. ## -*- coding: utf-8 -*- 
  221. ## Author : 
  222.  
  223. def checkName(): 
  224.     wCount,nList = 0,[] 
  225.     hDone = False 
  226.     while not hDone: 
  227.         banner = '''''Input names,"LastName,FirstName",and input a "." as End Of Input!''' 
  228.         try
  229.             eoi = raw_input(banner) 
  230.         except (EOFError,KeyboardInterrupt): 
  231.             eoi = "." 
  232.         if eoi != "."
  233.             name = eoi 
  234.             lf = name.split(','
  235.             if len(lf) == 2
  236.                 if 0 not in [len(x) for x in lf]:      ## "LastName,FirstName" 各自长度不能为空 
  237.                     nList.append(name) 
  238.                 else
  239.                     print "Wrong format... LastName,FirstName cann't be zero length." 
  240.                     wCount += 1 
  241.                     print "You have done this %d time(s) already. Fixing input..." % wCount 
  242.             else
  243.                 print "Wrong format... at least ',' between LastName,FirstName,Try again ?" 
  244.                 continue 
  245.         if eoi == "."
  246.             print [name for name in sorted(nList)] 
  247.             hDone = True 
  248.  
  249. checkName() 
  250.  
  251.  
  252. 12. (整型)位操作. 编写一个程序,用户给出起始和结束数字后给出一个下面这样的表格,分 
  253.     别显示出两个数字间所有整型的十进制,二进制,八进制和十六进制表示.如果字符是可 
  254.     打印的ASCII字符,也要把它打印出来,如果没有一个是可打印字符,就省略掉ASCII那一 
  255.     栏的表头.请参考下面的输入输出格式: 
  256.         输出示例1 
  257.     ------------------------ 
  258.         输入起始值:9 
  259.         输入结束值:18 
  260.     DEC        BIN       OCT       HEX 
  261.     -----------------------------------------   
  262.     9         01001      11         9 
  263.     10        01010      12         a 
  264.     11        01011      13         b   
  265.     12        01100      14         c 
  266.     13        01101      15         d 
  267.     14        01110      16         e 
  268.     15        01111      17         f 
  269.     16        10000      20         10 
  270.     17        10001      21         11 
  271.     18        10010      22         12 
  272.         输出示例2 
  273.     ------------------------ 
  274.         输入起始值:26 
  275.         输入结束值:41 
  276.     DEC        BIN       OCT       HEX         ASCII 
  277.     -----------------------------------------------------   
  278.     26        011010      32         1a 
  279.     27        011011      33         1b 
  280.     28        011100      34         1c   
  281.     29        011101      35         1d 
  282.     30        011110      36         1e 
  283.     31        011111      37         1f 
  284.     32        100000      40         20 
  285.     33        100001      41         21           ! 
  286.     34        100010      42         22           " 
  287.     35        100011      43         23           # 
  288.     36        100100      44         24           $ 
  289.     37        100101      45         25           % 
  290.     38        100110      46         26           & 
  291.     39        100111      47         27           ' 
  292.     40        101000      50         28           ( 
  293.     41        101001      51         29           ) 
  294. --------------------------------------------------------------------------- 
  295. #!/usr/bin/env python 
  296. ## -*- coding: utf-8 -*- 
  297. ## Author:  
  298.  
  299. def dec2bin(num): 
  300.     binList = [] 
  301.     while num > 1
  302.         binList.append(divmod(num,2)[1]) 
  303.         num = divmod(num,2)[0
  304.     else
  305.         binList.append(num) 
  306.     return ''.join([str(bit) for bit in reversed(binList)]) 
  307.  
  308. def main(f,t): 
  309.     print "%s\n输入起始值:%d\n输入结束值:%d" % ('-'*25,f,t) 
  310.     if t <= 256 and f >= 33
  311.         print "DEC           BIN        OCT         HEX     ASCII  \n%s" % ('-'*50
  312.         for nu in xrange(f,t): 
  313.             print "%3s %15s %10s %10s %6c" % (nu,dec2bin(nu),oct(nu),hex(nu),nu) 
  314.     elif f < 33
  315.         print "DEC           BIN         OCT         HEX  \n%s" % ('-'*50
  316.         for nu in xrange(f,t): 
  317.             print "%3s %15s %10s %10s" % (nu,dec2bin(nu),oct(nu),hex(nu)) 
  318.  
  319. if __name__ == "__main__"
  320.     f = int(raw_input("输入起始值:")) 
  321.     t = int(raw_input("输入结束值:")) 
  322.     main(f,t) 
  323.  
  324.  
  325. 13. 程序执行性能. 在8.6.2节里,我们介绍了两种基本的迭代序列方法:1)通过序列项,以及 
  326.     2)通过序列索引遍历. 该小节的末尾我们指出后一种方法在序列很长的时候性能不佳 
  327.     (在我的系统下,性能差了将近两倍)你认为它的原因是什么? 
  328. 测试结果恰好相反, 可能方法不对.  求高手解答. 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值