《Python核心编程》第八章练习解析

来源:互联网 发布:money for mac 破解版 编辑:程序博客网 时间:2024/06/10 07:45

第八章

第一题:

条件语句。请看那下边的代码:

#statement Aif x > 0:    #statement B    passelif x < 0:    #statement C    pass else:    #statement D    pass#statement E
(a) 如果x<0,上面的哪个语句(A,B,C,D,E)将被执行?

statement C

(b) 如果x==0,上面哪个语句居于将被执行?

statement D

(c) 如果x>0,上面哪个语句将被执行?

statement B

第二题:

循环。编写一个程序,让用户输入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。

#-*- coding:utf-8 -*-#2015-04-06def xunhuan(f,t,i):    while f <= t:        print f,        f += i         if __name__=='__main__':    num = map(int,raw_input('Please input date:').split())    xunhuan(num[0],num[1],num[2])


第三题:

range()。如果我们需要生成下面的这些列表,分别需要在range()内建函数提供哪些参数?

(a) [0,1,2,3,4,5,6,7,8,9]

range(10)

(b) [3,6,9,12,15,18]

range(3,20,3)

(c) [-20,200,420,640,860]

range(-20,900,220)

第四题:

素数。我们在本章已经给出了一些代码来确定一个数的最大约数或者他是否是一个素数。请把相关的代码转换成一个返回值为布尔值的函数,函数名为isprime()。如果输入是一个素数,那么返回True,否则返回False。

def isprime(num):    for i in range(2,num):        if num % i==0:            return False    else:        return True

第五题:

约数。完成一个名为getfactors()的函数。他接受一个整形作为参数,返回他所有的约数的列表,包括1和他本身。

def getfactors(num):    mylist = []    for i in range(1,num+1):        if num % i==0:            mylist.append(i)        return mylist

第六题:

素因子分解。以刚才的练习中的isprime()和getfactors()函数为基础编写一个函数,他接受一个整形作为参数,返回该整形的所有素数因子的列表。这个过程叫做素因子分解,他输出的所有因子应该是原来的数字。注意列表里可能有重复的元素。例如输入20,返回结果应该是[2,2,5]。

#-*- coding:utf-8 -*-#2015-04-06def isprime(num):    for i in range(2,num):        if num % i==0:            return False    else:        return Truedef getfactors(num):    mylist = []    while not isprime(num):        for i in range(2,num+1):            if num % i==0:                if isprime(i):                    mylist.append(i)                    num = num/i                     break    else:        mylist.append(num)    return mylist        if __name__=='__main__':    num = input('Please input a number:')    print getfactors(num)


第七题:

完全数。完全数被定义成这样的样数字:它的约数(不包括它自己)之和为他本身。例如:6的约数是1,2,3,因为1+2+3=6,所以6被认为是一个完全数。编写一个名为isperfect()的函数,他接受一个整形作为参数,如果这个数字是完全数,返回1:否则返回0。

#-*- coding:utf-8 -*-#2015-04-07def getfactors(num):    mylist = []    for i in range(1,num):        if num % i==0:            mylist.append(i)    return mylistdef isperfect(num):    mylist = getfactors(num)    if sum(mylist)==num:        return 1    else:        return 0        if __name__=='__main__':    num = input('Please input a number:')    print isperfect(num)


第八题:

阶乘。一个数的阶乘被定义为从1到该数字所有数字的积。N的阶乘简写为N!。N!==factorial(N)==1*2.....*N,so  4!==1*2*3*4。写一个函数,指定N,返回N!的值。

def NNN(num):    temp = 1    for i in range(1,num+1):        temp = temp*i    return temp

第九题:

斐波那契数列。斐波那契数列形如1,1,2,3,5,8,13,21,等等。也就是说下一个值是前两个值得和。写一个函数,给定N,返回第N个斐波那契数字。例如,第1个斐波那契数字是1,第6个是8.

def NNN(num):    a = 1    b = 1    c = 2    if num==1 or num==2 :        return 1    else:        for i in range(3,num):            a = b + c             (a,c)=(c,a)            (b,a)=(a,b)        return c


第十题:

文本处理。统计一句话中的元音,辅音及单词个数,忽略元音和辅音的特殊情况。附加题:编写处理这些特殊情况的代码。

#-*- coding:utf-8 -*-#2015-04-07def count(mystring):    YY = 0    FY = 0    key = 0    for i in mystring:        if i=='a' or i=='e' or i=='i' or i=='o' or i=='u':            YY += 1        elif i!=' ':            FY += 1    key = len(mystring.split())    return [YY,FY,key]                if __name__=='__main__':    num = raw_input('Please input a number:')    print '元音数量为:',count(num)[0]    print '辅音数量为:',count(num)[1]    print '单词数量为:',count(num)[2]

第十一题:

#-*- coding:utf-8 -*-#2015-04-07def name(num):    count = 0    result = []    for i in range(num):        print 'Please enter name %d:' % i,        n_ame = raw_input()        if ',' in n_ame:            result.append(n_ame)        else:            count += 1            print 'Wrong format...should be Last,First.'            print 'You have done this %d time(s) already.Fixing input...' % count            n_ame = n_ame.split()            #print n_ame            result.append(n_ame[1]+','+n_ame[0])                return sorted(result)        if __name__=='__main__':    num = input('Enter total number of names:')    n_ame = name(num)    for i in n_ame:        print i


第十二题:

(整形)位操作。编写一个程序,用户给出起始和结束数字后给出一个下面的表格,分别显示两个数字间的十进制、二进制、八进制和十六进制。如果字符是可打印的ASCII字符,也要打印出来,如果没有一个是可打印的就省略ASCII那一栏的表头。

#-*- coding:utf-8 -*-#2015-04-07def output(start,end):    if start >=33 or end <= 126:        print '%-10s%-10s%-10s%-10s%-10s' % ('DEC','BIN','OCT','HEX','ASCII')        print '---------------------------------------------'    else:        print '%-10s%-10s%-10s%-10s' % ('DEC','BIN','OCT','HEX')        print '---------------------------'    for i in range(start,end+1):        if start >=33 or end <= 126:            print '%-10d%-10s%-10s%-10s' % (i,bin(i),oct(i),hex(i)),            if i >=33 and i<=126:                print '%-10s' % chr(i)            else:                print '%-10s' % ' '        else:            print '%-10d%-10s%-10s%-10s' % (i,bin(i)[2:],oct(i)[1:],hex(i)[2:],)        if __name__=='__main__':    start = input('Please input start number:')    end = input('Please input end number:')    output(start, end)

运行结果

Please input start number:9Please input end number:18DEC       BIN       OCT       HEX       --------------------------------9         0b1001    011       0x9       10        0b1010    012       0xa       11        0b1011    013       0xb       12        0b1100    014       0xc       13        0b1101    015       0xd       14        0b1110    016       0xe       15        0b1111    017       0xf       16        0b10000   020       0x10      17        0b10001   021       0x11      18        0b10010   022       0x12      


Please input start number:26Please input end number:41DEC       BIN       OCT       HEX       ASCII     ---------------------------------------------26        0b11010   032       0x1a                 27        0b11011   033       0x1b                 28        0b11100   034       0x1c                 29        0b11101   035       0x1d                 30        0b11110   036       0x1e                 31        0b11111   037       0x1f                 32        0b100000  040       0x20                 33        0b100001  041       0x21       !         34        0b100010  042       0x22       "         35        0b100011  043       0x23       #         36        0b100100  044       0x24       $         37        0b100101  045       0x25       %         38        0b100110  046       0x26       &         39        0b100111  047       0x27       '         40        0b101000  050       0x28       (         41        0b101001  051       0x29       )         

第十三题

程序执行性能。在8.5.2节里,我们介绍了两种基本的迭代序列方法:(1)通过序列项,以及(2)通过序列索引遍历。该小节的末尾我们指出后一种方法在序列很长的时候性能不佳,你认为它的原因是什么?

答:略。

0 0
原创粉丝点击