• Python 核心编程(第二版)第八章 练习完整答案[转载]


    由于我能力有限,做的答案不一定是最佳答案,仅供参考。另外,由于只是知识点,所以在程序中不一定会进行完整的数据类型检测。只列出函数部分,输出部分,自己调用下就行了。所有题目都经过测试可用。
    
     来源http://yazku.blog.163.com/
    
    def loop(f, t, i):
        '''8-2输入3个数字,从f计数到t,i为步长'''
        for n in xrange(f,t+1,i):
            print n,
    
    def isprime(num):
        '''8-4 输入数字,返回是否是素数'''
        # 素数表示只能被1和本身整除的数,所以在count>1的情况下如果都无法除尽,那么就是素数
        # count为什么要 num/2 呢?
        # 因为2是最小的偶数,获得的值就是 num的最大可能被除的数,
        # num不可能被一个比2更小的整数除,
        # 因为如果是1,那么就反应不出(素数也可以被1整除),而如果大于2则是无不能确定,如果是3,而输入是4,无疑效率会变得更低?
        # 更容易理解的是   1<count<num-1 的方式,但是无疑, count >num/2的时候是不可能被除尽的,这些循环是多余的
        count = num/2
        while count>1:
            if num % count == 0:
                return False
            count -=1
        return True
    
    def getfactors(num,addself=True):
        '''8-5返回数所有的约数,包括1和它本身'''
        # addself 表示,约数中是否包含它本身
        count = num/2
        factors = []
        if addself:factors =[num]
        while count:
            if not num%count:
                factors.append(count),
            count-=1
        return factors
    
    def primesplit(num):
        '''8-6 素因子分解'''
        # 所谓素因子分解就是将num 分解成几个素数相乘
        # 我们要求的就是哪几个素数乘积为num,显示这几个素数
        # 比如 num = 20 返回 [2,2,5]
        # 分析 首先,如果输入的 num 是素数,那么返回的就是 1 和 它本身
        # 如果不是素数,那么获得他的约数,约数中2肯定是有的,关键是几个2的问题咯?
        # 这里会用到上面的 isprime 和 getfactors 函数
        re = []
        if isprime(num):re = [1,num]
        else:
            # 素数一定是从2开始的
            prime = 2
            count = num/2
            # 素数一定是小于 num/2 的
            while prime<count:
                if num%prime==0:
                    num /= prime
                    re.append(prime)
                    continue
                prime+=1
        return re
    
    def isperfect(num):
        '''8-7 全数就是他的约数之和为它本身,比如 6的约数是 1,2,3 1+2+3=6'''
        if isprime(num):return 0
        else:
            if sum(getfactors(num,False))==num:return 1
        return 0
    
    def factorial(num, step=1):
        '''8-8 阶乘'''
        # 阶乘就是返回 num! 就是 1到num所有数的乘积,例如6! 1*2*3*4*5*6
        # add 表示的是阶层的步进,默认是1
        # 0 的阶乘是 1
        # 负数没有阶乘
        # 小数没有阶乘
        if not float(num).is_integer():return False
        if num<0:return False
        if num == 0 or num ==1 :return 1
        else:
            re = 1
            for i in xrange(1,num+1,step):
                re *=i
        return re
    
    def fibonacci(num):
        '''8-9 fibonacci 数列,给定 num 返回第num个的值'''
        # fibonacci 数列形如 1,1,2,3,5,8,13,21
        # 也就是说下一个值是数列前2个和
        if num<1 or int(num)!=num:return False
        if num == 1:return 1 # 第一个其实是没规律的,只返回一个1,从第二个开始就是0+1,1+1...
        # 分析:
        # 第0个是  0
        # 第1个是  1
        # 第二个是 1+0      1
        # 第三个是 1+1      2
        # 第四个是 2+1      3
        # 第五个是 2+3      5      5=3+2
        # 从这样看,其实第2个,应该是第三个,因为第0个也是一个
        # 我在这里是这样分析的,既然要求第N个,我们知道N是 N-1和N-2的和,那么我们需要在运行中保存
        # N-1和N-2这两个临时变量N-2 我设为N1,N-1我设为N2
        re = 0 #第0位是0
        for i in xrange(num-1):
            if re == 0:N1,N2=0,1
            re =N1+N2
            N1,N2=N2,re
        return re
    
    def counteng(string):
        '''8-10 统计一下一句话中元音,辅音,和单词的个数,忽略元音和辅音等特殊情况'''
        # 所谓特殊情况就是某些单词用元音开头,但是不发元音,有些单词辅音开头但是发元音
        # 如果要处理这些特殊单词,那么需要有特殊单词表或者规律,这个我就不做了,不难实现
        # 思路:匹配单词,如果符合特殊规则或者单词表,那么元音[辅音]数量相应减1或者加1
        # 我这里只要处理 a,e,i,o,u的个数即可    
        # 所谓单词数,特别是英文中,比较容易,只要用空格分隔就可
        words = len(string.split())
        string=string.upper()#换成大写,方便一点
        yuans = fus = 0
        # 统计元音数
        for i in string:
            # 只处理那啥字母,不处理特殊符号
            # 大写元音的 ord 是65,69,73,79,85
            # 大写字母即ord 65-90
            n = ord(i)
            if n in xrange(65,91):
                if n in [65,69,73,79,85]:
                    yuans+=1
                else:
                    fus+=1
        return [yuans,fus,words]
    
    def inname():
        '''8-11 文本处理,输入英文名格式:Last Name, First name
            如果输入的格式是 First name LastName(也就是没有逗号)
            那么互换位置,提示错误,记录错误数
            输入完毕后,显示名字列表
        '''
        # 分析,书中首先要求用户输入要输入名字的数量,这个不自然,我改成输入q则退出
        print '输入英文名字,格式如 名,姓 \n输入q则退出'
        names = []
        error = 0
        while True:
            name = raw_input('请输入姓名:').strip().split(',')
            if name[0] =='':continue
            if len(name) == 1:
                if name[0].lower() == 'q': break
                error +=1
                print '格式错误...正确应该是 名,姓\n你已经错了%d次。修复输入...\n' % error
                name = name[0].split()
                name = name[1]+','+name[0]
            else:
                name = name[0].strip()+','+name[1].strip()
            names.append(name)
        for i in names:
            print i
    
    def out():
        '''8-12 输入整数1,整数2,显示一张表格,包括十进制,二进制,八进制,十六进制和ASCII'''
        # ASCII中 0-32 127 这34个是控制符,不用输出
        # 超过127的数字也不用输出,因为没有对应的ASCII
        num1 = int(raw_input('Enter begin value:').strip())
        num2 = int(raw_input('Enter end value:').strip())
        # 这里的dl,bl,ol,hl,al表示每一列的宽度
        dl,bl,ol,hl,al = \
        len(str(num2))+5,len(bin(num2))+3,len(oct(num2))+4,len(hex(num2))+3,5
        # 输出标题,居中
        print 'DEC'.center(dl),'BIN'.center(bl),'OCT'.center(ol),'HEX'.center(hl),'ASCII'.center(al)
        # 输出横线
        print '-'*(sum([dl,bl,ol,hl,al])+5)
        ascii = ''
        for i in xrange(num1,num2+1):
            # Ascii 只有在这个区间内才显示
            if 32<i<127:ascii = chr(i)
            print str(i).center(dl),bin(i)[2:].center(bl),oct(i)[1:].center(ol),hex(i)[2:].center(hl),ascii.center(al)
            ascii=''
    

      

  • 相关阅读:
    个人心情闲扯贴~~
    近阶段学习感悟--大一下半学期
    HDU 1003 Max Sum 解题报告
    开始我的新园地--献给我的那些学长们
    软件公司职位简称
    Sql Server参数化查询之where in和like实现详解 [转]
    21个值得收藏的Javascript技巧
    [转]js刷新父窗体
    Oracle10g 连接 sqlserver 在server2008r2 中连接 iis7 .net4.0
    Oracle10g 连接 sqlserver hsodbc dblink 方式 非透明网关
  • 原文地址:https://www.cnblogs.com/caizhendong/p/5456068.html
Copyright © 2020-2023  润新知