Python 核心編程(第二版)第八章 練習完整答案[轉載]

來源:互聯網
上載者:User

由於我能力有限,做的答案不一定是最佳答案,僅供參考。另外,由於只是知識點,所以在程式中不一定會進行完整的資料類型檢測。只列出函數部分,輸出部分,自己調用下就行了。所有題目都經過測試可用。

 來源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=''

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.