1. 程式人生 > >Python核心程式設計(第二版)第六章部分習題程式碼

Python核心程式設計(第二版)第六章部分習題程式碼

6-2字串識別符號.修改例 6-1 的 idcheck.py 指令碼,使之可以檢測長度為一的識別符號,並且可以識別 Python 關鍵字,對後一個要求,你可以使用 keyword 模組(特別是 keyword.kelist)來輔助

                #!/usr/bin/env python
                def check_id(myInput):
                        import string
                        import keyword
                        alphas = string.letters + '_'
                        nums = string.digits
                        alphanums = alphas + nums
                        key = keyword.kwlist
                        str_length = len(myInput)
                        if str_length == 0:
                                print 'WRONG: zero-lengthed string("%s").'%(myInput)
                        elif myInput[0] not in alphas:
                                print '''invalid: first symbol must be alphabetic'''
                        elif myInput in key:
                                print '''invalid :Input cannot be a keyword'''
                        else:
                                for otherChar in myInput[1:]:
                                        if otherChar not in alphanums:
                                                print '''invalid: remaining symbols must be alphanumertic'''
                                                break
                                else:
                                        print '%s is logal identifier.' % (myInput)
                if __name__ == '__main__':
                        while True:
                                myInput = raw_input('Identifier to test?')
                                check_id(myInput)       

6-3.排序

(a) 輸入一串數字,從大到小排列之。

(b) 跟 a 一樣,不過要用字典序從大到小排列之.。

                    s = raw_input('please enter a serial of numbers,using SPACE to seperate: \n')
                    import string
                    alphas = string.digits + " "
                    for eachs in s:
                            if eachs not in alphas:
                                    print 'you may have entered non-digit character.'
                                    break
                    a = s.strip()
                    s_input = a.split(" ")
                    num = []
                    for i in s_input:
                            num.append(int(i))
                    num.sort()
                    num.reverse()
                    print 'Sorted result(Big-->Small): ',
                    for t in num:
                            print t,
                    print
                    print 'acording the directory to get result: ',
                    for i,j in enumerate(num):
                            print (i,j),                    

6-6.字串.建立一個 string.strip()的替代函式:接受一個字串,去掉它前面和後面的空格(如果使用 stri

ng.*strip()函式那本練習就沒有意義了)

                #!/usr/bin/env python
                s = raw_input('please enter a string : ')
                print 'the strip of string is :',
                import string
                alpha = ' ' + string.letters
                st = []
                for c in s :
                        if c not in alpha:
                                print 'Error:you may have entered non-string'
                                exit(0)
                                break
                l = len(s)
                i = 0
                while i < l:
                        if s[i] == ' ':
                                i += 1
                        else:
                                break
                s = s[i:]
                l = len(s) - 1
                while l > 0:
                        if s[l] == ' ':
                                l -= 1
                        else:
                                break
                s = s[:l+1]
                print s

6-7.除錯。看一下在例 6.5 中給出的程式碼(buggy.py),這個程式有一個很大的問題,比如輸入 6,12,20,30,等它會死掉,實際上它不能處理任何的偶數,找出原因。

                #!/usr/bin/env python
                num_str = raw_input('Enter a number: ')
                num_num = int(num_str)
                fac_list = range(1, num_num+1)
                print "BEFORE:", fac_list
                set_fac = set(fac_list)
                i = 0
                while i < len(fac_list):
                        if num_num % fac_list[i] == 0:
                                del fac_list[i]
                        else:
                                i = i + 1
                print "AFTER:"+str(fac_list)
                print "Factors of %d are: "%num_num, str(list(set_fac-set(fac_list)))

6-8.列表。給出一個×××值,返回代表該值的英文,比如輸入89返回“eight-nine”。附加題:能夠返回符合英文語法規則形式,比如輸入“89”返回“eighty-nine”。本練習中的值限定在0~1000。

                #!/usr/bin/env python
                #_*_ coding:utf-8 _*_
                alpha = ['one','two','three','forth','five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen',\
                                 'fifteen','sixteen','seventeen','eighteen','nineteen','twenty','']
                tendigits = ['twenty','thirty','forty','fifty','sixty','eighty','ninety','']
                s_num = raw_input("enter a number: ")
                s = int(s_num)
                if s < 0:
                        print 'Error:you may have entered a minus.'
                elif s <= 20:
                        print alpha[s - 1]
                elif s < 100:
                        i = s / 10
                        j = s - i * 10
                        print tendigits[i - 2]+'-'+alpha[j - 1]
                elif s <1000:
                a = s / 100
                b = (s - a * 100) / 10
                c = s - a * 100 - b * 10
                if b == 0 and c ==0:
                print alpha[a - 1]+' hundred'
                elif b == 0 and c != 0:
                print alpha[a-1]+' hundred'+' and '+alpha[c-1]
                elif b != 0 and c == 0:
                print alpha[a-1] + tendigits[b-2]
                else:
                print alpha[a - 1]+' hundred'+' and '+tendigits[b - 2]+'-'+alpha[c - 1]
                elif s == 1000:
                print 'one thousand'

6-10.字串。寫一個函式,返回一個跟輸入字串相似的字串,要求字串的大小寫翻轉。比如,輸入“Mr.Ed”,應該返回“mR.eD”作為輸出。

                #!/usr/bin/env python
                #_*_ coding: utf-8 _*_
                def reverseletters():
                        str_input = raw_input('Input a string : ')
                        #str_input.upper()
                        #str_input.lower()
                        print str_input.swapcase()
                if __name__ =='__main__':
                        reverseletters()

6-12. 字串.

a). 建立一個名字為 findchr() 的函式, 函式宣告如下:

def findchr(string, char)

findchr() 要在字串 string 中查詢字元 char, 找到就返回該值的索引,否則返回-1. 不能用string.*find()

或者 string.*index() 函式和方法.

            #!/usr/bin/env python
            #_*_ coding : utf-8 _*_
            def findchr(string,char):
                    i = 0
                    l = len(string)
                    if char not in string:
                            print -1
                    else:
                            while i < l:
                                    if string[i] == char:
                                            print i,
                                    i += 1
            if __name__ == '__main__':
                    string = raw_input("please input a string :")
                    char = raw_input('a char:')
                    findchr(string,char)

b). 建立另一個叫 rfindchr() 的函式,查詢字元 char 最後一次出現的位置. 它跟findchr() 工作類似,不過它是

從字串的最後開始向前查詢的.

            #! /usr/bin/env python
            #_*_ coding : utf-8 _*_
            def rfindchar():
                    str_input = raw_input('please enter a string :')
                    str_char = raw_input('please enter a char :')
                    l = len(str_input)
                    i = -1
                    for a in range(i,-l-1,-1):
                            while i >= -l:
                                    if str_input[a] == str_char:
                                            print a+l

c). 建立第三個函式, 名字叫做 subchr(), 宣告如下:

def subchr(string, origchar, newchar)

subchr() 跟 findchr() 類似, 不同的是, 如果找到匹配的字元就用新的字元替換原先字元.返回修改後的字元.

            #! /usr/bin/env python
            #_*_ coding:utf-8 _*_
            def subchar(string, origchar, newchar):
                    l = len(string)
                    i = 0
                    while i < l:
                            if string[i] == origchar:
                                    string = string[:i]+newchar+string[i+1:]
                            i += 1
                    print string
            if __name__ == '__main__':
                    string = raw_input('please enter a string :')
                    origchar = raw_input('input a origchar : ')
                    newchar = raw_input('input a new char : ')
                    subchar(string,origchar,newchar)

            import string
            string.atoi()

6-14. 隨機數. 設計一個"石頭,剪子,布"遊戲,有時又叫"Rochambeau", 你小時候可能玩過,下面是規則. 你和你的對手, 在同一

時間做出特定的手勢,必須是下面一種: 石頭,剪子,布. 勝利者從下面規則中產生,這個規則本身是個悖論.

a). 布包石頭;

b). 石頭砸剪子

c). 剪子剪破布.

在你的計算機版本中, 使用者輸入她/他的選項, 計算機找一個隨機選項,然後由你的程式來決定一個勝利者或者平手.

注意: 最好的演算法是儘量少的使用if語句.

                #!/usr/bin/env python
                #_*_ coding : utf-8 _*_
                def Rochambeau():
                        text = {0 : 'Cloth', 1 : 'Scissor', 2 : 'Stone'}
                        import random
                        mac = random.randrange(0,3,1)
                        humans = int(raw_input('your choice(0-Cloth, 1-Scissor, 2-Stone):'))
                        nums = range(0,3,1)
                        print "You: %s   Computer: %s " % (text[humans], text[mac])
                        print 'the result is : '
                        if humans not in nums:
                                print 'Error:Wrong input!'
                        elif humans-mac == 0:
                                print 'Draw'
                        elif humans-mac == 1 or humans-mac == -2:
                                print 'You win !!!'
                        else:
                                print 'Computer win !!!'
                if __name__ == '__main__':
                        while True:
                                Rochambeau()