第八章练习题

时间:2023-02-23 15:25:13
  • 1. 条件语句. 请看下边代码: 
  • # statement A 
  • if x > 0
  •     # statement B 
  •     pass 
  • elif x < 0
  •     # statement C 
  •     pass 
  • else
  •     # statement D 
  •     pass 
  • # statement E 
  • a) 如果x<0,上面哪个语句(A,B,C,D,E)将被执行? 
  • b) 如果x==0,上面哪个语句将被执行? 
  • c) 如果x>0,上面哪个语句将被执行? 
  • C, D, B 
  •  
  •  
  • 2. 循环. 编写一个程序,让用户输入3个数字:(f)rom,(t)o和(i)ncrement. 以i为步长,从 
  •    f计数到t,包括f和t. 例如,如果输入的是f==2,t==26,i==4,程序将输出2,6,10,14,18
  •    22,26. 
  • range(f,t,i) 
  •  
  •  
  • 3. range(). 如果我们需要生成下面的这些列表,分别需要在range()内建函数中提供哪些 
  •    参数? 
  •    a) [0,1,2,3,4,5,6,7,8,9
  •    b) [3,6,9,12,15,18
  •    c) [-20,200,420,640,860
  • a) range(10
  • b) range(3,20,3
  • c) range(-20,861,220
  •  
  •  
  • 4. 素数. 我们在本章已经给出了一些代码来确定一个数字的最大约数或者它是否是一个素 
  •    数. 请把相关代码转换为一个返回值为布尔值的函数,函数名为isprime(). 如果输入的 
  •    是一个素数,那么返回True,否则返回False
  • #!/usr/bin/env python 
  • ## -*- coding: utf-8 -*- 
  • ## Author:  
  •  
  • def isprime(num): 
  •     count = num / 2 
  •     while count > 1
  •         if num % count == 0
  •             #print "largest factor of %d is %d" % (num,count) 
  •             return False 
  •             break 
  •         count -= 1 
  •     else
  •     #    print num, "is prime" 
  •         return True 
  •  
  • for eachNum in range(10,21): 
  •     print isprime(eachNum) 
  •  
  •  
  • 5. 约数. 完成一个名为getfactors()的函数.它接受一个整型作为参数,返回它所有约数的 
  •    列表,包括1和它本身. 
  • def getfactors(number): 
  •     factorList = [] 
  •     for i in range(1, number + 1): 
  •         if number % i == 0 and isprime(i): 
  •             factorList.append(i) 
  •     return factorList 
  •  
  • def getfactors(number): 
  •     fList = [1,number] 
  •     for i in range(1,number + 1): 
  •         if number % 2 == 0
  •             fList.append(2
  •             number = number / 2 
  •         else
  •             fList.append(number) 
  •             break 
  •     return fList 
  •  
  • 6. 素因子分解. 以刚才练习中的isprime()和getfactors()函数为基础编写一个函数,它接受 
  •    一个整型作为参数,返回该整型所有素数因子的列表.这个过程叫做求素因子分解,它输出 
  •    的所有因子之积应该是原来的数.注意列表里可能有重复的元素.例如输入20,返回结果应该 
  •    是[2,2,5]. 
  • #!/usr/bin/env python 
  • ## -*- coding: utf-8 -*- 
  • ## Author: 
  •  
  • def isprime(num): 
  •     count = num / 2 
  •     while count > 1
  •         if num % count == 0
  •             #print "largest factor of %d is %d" % (num,count) 
  •             return False 
  •             break 
  •         count -= 1 
  •     else
  •     #    print num, "is prime" 
  •         return True 
  •  
  • def getfactors(number): 
  •     fList = [1
  •     for i in range(1,number + 1): 
  •         if number % 2 == 0
  •             fList.append(2
  •             number = number / 2 
  •         else
  •             fList.append(number) 
  •             break 
  •     return fList 
  •  
  • number = int(raw_input("Enter a number:")) 
  • if isprime(number): 
  •     print "You Entered a prime..." 
  • else
  •     print getfactors(number) 
  •  
  •  
  • 7. 完全数. 完全数被定义为这样的数字: 它的约数(不包括它自己)之和为它本身.例如:6的约 
  •    数是1,2,3, 因为1+2+3=6,所以6被认为是一个完全数.编写一个名为isperfect()的函数,它 
  •    接受一个整型作为参数,如果这个数字是完全数,返回1;否则返回0. 
  • #!/usr/bin/env python 
  • ## -*- coding: utf-8 -*- 
  • ## Author: 
  •  
  • def getfactors(number): 
  •     fList = [1
  •     for i in range(1,number + 1): 
  •         if number % 2 == 0
  •             fList.append(2
  •             number = number / 2 
  •         else
  •             fList.append(number) 
  •             break 
  •     return fList 
  •  
  • def isperfect(number): 
  •     if  sum(getfactors(number)) == number: 
  •        return 1 
  •     else
  •         return 0 
  •  
  • number = int(raw_input("Enter a number:")) 
  • print isperfect(number) 
  •  
  •  
  • 8. 阶乘. 一个数的阶乘被定义为从1到该数字所有数字的乘积. N的阶乘简写为N!. 
  •    N! == factorial(N) == 1*2*3*...*(N-2)*(N-1)*N,所以, 
  •    4! == 1 * 2 * 3 * 4,写一个函数,指定N,返回N!的值. 
  • #!/usr/bin/env python 
  • ## -*- coding: utf-8 -*- 
  • ## Author: 
  •  
  • def isfactorial(number): 
  •     return reduce(lambda x,y:x*y,range(1,number + 1)) 
  •  
  • number = int(raw_input("Enter a number:")) 
  • print isfactorial(number) 
  •  
  •  
  • 9. 斐波那契数列.  斐波那契数列形如1,1,2,3,5,8,13,21,等等. 也就是说,下一个值是序列 
  •    中前两个值之和. 写一个函数,给定N,返回第N个斐波那契数字.例如,第1个斐波那契数字 
  •    是1,第6个是8. 
  • #!/usr/bin/env python 
  • ## -*- coding: utf-8 -*- 
  • ## Author: 
  •  
  • def fibonacci(x): 
  •     fibList = [1,1
  •     for i in xrange(2,x+1): 
  •         fibList.append(fibList[i-2] + fibList[i-1]) 
  •     return fibList[-1
  •  
  • num = int(raw_input("Enter a numer:")) 
  • print fibonacci(num) 
  •  
  •  
  • 10. 文本处理. 统计一句话中的元音,辅音及单词(以空格分割)的个数.忽略元音和辅音的特 
  •     殊情况,如"h","y","qu"等. 附加题:编写处理这些特殊情况的代码. 
  • #!/usr/bin/env python 
  • ## -*- coding: utf-8 -*- 
  • ## Author:  
  •  
  • def f(sentence): 
  •     vChar,vowel,word,consonant = "aeiou",0,0,0 
  •     for eChar in sentence: 
  •         if eChar.isalpha(): 
  •             if eChar in vChar: 
  •                 vowel += 1 
  •             else
  •                 consonant += 1 
  •  
  •     return (vowel,consonant,len([eWord for eWord in sentence.split()])) 
  •  
  • sentence = raw_input("Input a Sentence...\n"
  • print "vowel: %d,  consonant: %d,  word: %d" % f(sentence) 
  •  
  •  
  • 11. 文本处理. 要求输入一个姓名列表,输入格式是"LastName,FirstName",即姓 逗号 名.编 
  •     写程序处理输入,如果用户输入错误,比如"FirstName LastName,",请纠正这些错误,并通 
  •     知用户.同时你还需要记录输入错误次数.当用户输入结束后,给列表排序,然后以"姓,名" 
  •     的顺序显示. 
  •     输入输出示例(你不需要完全按照这里的例子完成): 
  • %nametrack.py 
  • Enter total number of names:5 
  • Please enter name0:Smith,Joe 
  • Please enter name1:Mary Wong 
  • >>Wrong format... should be Last,First. 
  • >>You have done this 1 time(s) already. Fixing input... 
  • Please enter name2:Hamilton,Gerald 
  • Please enter name3:Royce,Linda 
  • Please enter name4:Winston Salem 
  • >>Wrong format... should be Last,First. 
  • >>You have done this 2 time(s) already. Fixing input... 
  • The sorted list(by last name) is
  •    Hamilton,Gerald 
  •    Royce,Linda 
  •    Salem,Winston 
  •    Smith,Joe 
  •    Wong,Mary 
  • -------------------------------------------------------------------- 
  • #!/usr/bin/env python 
  • ## -*- coding: utf-8 -*- 
  • ## Author : 
  •  
  • def checkName(): 
  •     wCount,nList = 0,[] 
  •     hDone = False 
  •     while not hDone: 
  •         banner = '''''Input names,"LastName,FirstName",and input a "." as End Of Input!''' 
  •         try
  •             eoi = raw_input(banner) 
  •         except (EOFError,KeyboardInterrupt): 
  •             eoi = "." 
  •         if eoi != "."
  •             name = eoi 
  •             lf = name.split(','
  •             if len(lf) == 2
  •                 if 0 not in [len(x) for x in lf]:      ## "LastName,FirstName" 各自长度不能为空 
  •                     nList.append(name) 
  •                 else
  •                     print "Wrong format... LastName,FirstName cann't be zero length." 
  •                     wCount += 1 
  •                     print "You have done this %d time(s) already. Fixing input..." % wCount 
  •             else
  •                 print "Wrong format... at least ',' between LastName,FirstName,Try again ?" 
  •                 continue 
  •         if eoi == "."
  •             print [name for name in sorted(nList)] 
  •             hDone = True 
  •  
  • checkName() 
  •  
  •  
  • 12. (整型)位操作. 编写一个程序,用户给出起始和结束数字后给出一个下面这样的表格,分 
  •     别显示出两个数字间所有整型的十进制,二进制,八进制和十六进制表示.如果字符是可 
  •     打印的ASCII字符,也要把它打印出来,如果没有一个是可打印字符,就省略掉ASCII那一 
  •     栏的表头.请参考下面的输入输出格式: 
  •         输出示例1 
  •     ------------------------ 
  •         输入起始值:9 
  •         输入结束值:18 
  •     DEC        BIN       OCT       HEX 
  •     -----------------------------------------   
  •     9         01001      11         9 
  •     10        01010      12         a 
  •     11        01011      13         b   
  •     12        01100      14         c 
  •     13        01101      15         d 
  •     14        01110      16         e 
  •     15        01111      17         f 
  •     16        10000      20         10 
  •     17        10001      21         11 
  •     18        10010      22         12 
  •         输出示例2 
  •     ------------------------ 
  •         输入起始值:26 
  •         输入结束值:41 
  •     DEC        BIN       OCT       HEX         ASCII 
  •     -----------------------------------------------------   
  •     26        011010      32         1a 
  •     27        011011      33         1b 
  •     28        011100      34         1c   
  •     29        011101      35         1d 
  •     30        011110      36         1e 
  •     31        011111      37         1f 
  •     32        100000      40         20 
  •     33        100001      41         21           ! 
  •     34        100010      42         22           " 
  •     35        100011      43         23           # 
  •     36        100100      44         24           $ 
  •     37        100101      45         25           % 
  •     38        100110      46         26           & 
  •     39        100111      47         27           ' 
  •     40        101000      50         28           ( 
  •     41        101001      51         29           ) 
  • --------------------------------------------------------------------------- 
  • #!/usr/bin/env python 
  • ## -*- coding: utf-8 -*- 
  • ## Author:  
  •  
  • def dec2bin(num): 
  •     binList = [] 
  •     while num > 1
  •         binList.append(divmod(num,2)[1]) 
  •         num = divmod(num,2)[0
  •     else
  •         binList.append(num) 
  •     return ''.join([str(bit) for bit in reversed(binList)]) 
  •  
  • def main(f,t): 
  •     print "%s\n输入起始值:%d\n输入结束值:%d" % ('-'*25,f,t) 
  •     if t <= 256 and f >= 33
  •         print "DEC           BIN        OCT         HEX     ASCII  \n%s" % ('-'*50
  •         for nu in xrange(f,t): 
  •             print "%3s %15s %10s %10s %6c" % (nu,dec2bin(nu),oct(nu),hex(nu),nu) 
  •     elif f < 33
  •         print "DEC           BIN         OCT         HEX  \n%s" % ('-'*50
  •         for nu in xrange(f,t): 
  •             print "%3s %15s %10s %10s" % (nu,dec2bin(nu),oct(nu),hex(nu)) 
  •  
  • if __name__ == "__main__"
  •     f = int(raw_input("输入起始值:")) 
  •     t = int(raw_input("输入结束值:")) 
  •     main(f,t) 
  •  
  •  
  • 13. 程序执行性能. 在8.6.2节里,我们介绍了两种基本的迭代序列方法:1)通过序列项,以及 
  •     2)通过序列索引遍历. 该小节的末尾我们指出后一种方法在序列很长的时候性能不佳 
  •     (在我的系统下,性能差了将近两倍)你认为它的原因是什么? 
  • 测试结果恰好相反, 可能方法不对.  求高手解答.