python核心程式設計-第6章課後習題答案
6-2. 字串識別符號.修改例 6-1 的 idcheck.py 指令碼,使之可以檢測長度為一的識別符號,並且可以識別 Python 關鍵字,對後一個要求,你可以使用 keyword 模組(特別是 keyword.kelist)來幫你.
#coding=utf-8 import string import keyword alphs = string.letters + '_' num = string.digits print 'Welcome to the Identifier Checker V1.0' print 'Testees must be at least 1 chars long.' myinput = raw_input('Identifier to test?') if len(myinput)>=1: if myinput[0] not in alphs: #如果第一個數不是下劃線或字母 print 'invalid: first symbol must be alphabetic' #輸出提示資訊 else: #如果第一個數是下劃線或字母 for otherchar in myinput[1:]: #迴圈檢查後面的是否符合要求 if otherchar not in alphs+num: #不符合要求輸出錯誤資訊 print "invalid:remaining symboles" break else: if myinput in keyword.kwlist: #符合要求進一步檢查是否為python關鍵字 print "invalid: symbol is reserved as keyword" else: print "okys as an identifier"
6-3 排序
(a) 輸入一串數字,從大到小排列之.
(b) 跟 a 一樣,不過要用字典序從大到小排列之
num = raw_input("Enter a string of numbers,for example (12,14,15):")
num = list(num.split(','))
num.sort(reverse=True)
print num
6-4.算術。更新上一章裡面你的得分測試聯絡方案,把測試得分放到一個列表中去。你的程式碼應該可以計算出一個平均分,見聯絡2-9和聯絡5-3
def scoreCalculate(score): if 90<= score <= 100: print 'you score is A!' elif 80<= score <=89: print 'you score is B!' elif 70<= score <=79: print 'you score is C!' elif 60<= score <=69: print 'you score is D!' else: print 'you score is F!' while 1: choice = ("1.Grade level \n 2.average:") if choice == "1": while 1: score= raw_input('enter you socre(q is qiut):') scoreCalculate(socre) if score == "q": break elif choice == "2": yourscore = [] while True: score = raw_input("Enter your score (q for quit)-->") if score == 'q': break else: yourscore.append(int(score)) average = float(sum(yourscore)) / len(yourscore) print average else: print "worry enter!" break
6-5字串
(a)更新你在練習2-7裡面的方案, 使之可以每次向前向後都顯示一個字串的一個字元.
(b)通過掃描來判斷兩個字串是否匹配(不能使用比較操作符cmp()內建函式). 附加題: 在你的方案中加入大小寫區分.
(c)判斷一個字串是否重現(後面跟前面一致), 附加題: 在處理了嚴格的迴文之外,加入對例如控制符號和空格的支援.
(d) 接受一個字元在其後面加一個反向拷貝,構成一個迴文字串.
(a)
str1 = "This is a test string" count = 0 while count < len(str): print str1[0:count] count += 1
str1 = "This is a test string"
strlen = len(str1)
for i in range(strlen,0,-1):
print str1[i-1:]
(b)
srt1 = raw_input('enter string:')
srt2 = raw_input('enter other string:')
if len(srt1)!=len(srt2):
print "Not match"
else:
for i in range(len(srt1)):
if srt1[i] != srt2[i]:
print "They don't match."
break
else:
print "They match"
(c)
str1 = raw_input('enter somthing:')
lenstr = len(str1)
if lenstr%2 != 0:
for i in range(lenstr/2):
if str1[i] != str1[lenstr-i-1]:
print "not repeat"
break
else:
print "repeat"
if lenstr%2 == 0:
for i in range(lenstr/2):
if str1[i] != str1[lenstr-i-1]:
print "not repeat"
break
else:
print "repeat"
(d)
str1 = raw_input('enter somting:')
lenstr = len(str1)
str1list = list(str1)
for i in range(lenstr):
str1list.append(str1list[lenstr-i-1])
newstr = ''.join(str1list)
print newstr
6-6 字串.建立一個 string.strip()的替代函式:接受一個字串,去掉它前面和後面的空格(如果使用 string.*strip()函式那本練習就沒有意義了)
def stringstrip(str1):
for i in str1:
if i ==" ":
str1.remove(i)
str1 = list(raw_input('enter somthing:'))
stringstrip(str1)
print "".join(str1)
6-7 除錯.看一下在例 6.5 中給出的程式碼(buggy.py)
(a)研究這段程式碼並描述這段程式碼想做什麼.在所有的(#)處都要填寫你的註釋.
(b)這個程式有一個很大的問題,比如輸入 6,12,20,30,等它會死掉,實際上它不能處理任何的偶數,找出原因.
(c)修正(b)中提出的問題.
#!user/bin/env python
#刪除列表中能被使用者輸入數整除的元素
num_str = raw_input('Enter a number:')
#使用者輸入除數,將使用者輸入的字串轉換為整數
num_num = int(num_str)
#fac_list為1~num_num 的列表
fac_list = range(1,num_num+1)
print "BEFORE:",'fac_list'
#輸出初始fac_list列表 計數i=0
i = 0
#當i小於fac_list中總個數時,永遠為真,當超出時,迴圈結束
while i<len(fac_list):
#使用者輸入的除數,依次除以列表元素,能整除的刪除
if num_num%fac_list[i] == 0:
def fac_list[i]
else:
i += 1 #當不能整除時 i = i + 1 繼續迴圈
#最後輸出更改後的列表
print "AFTER:",'fac_list'
6-8 列表。給出一個整型值,返回代表該值得英文,比如輸入89會返回“eight-nine”。附加題:能夠返回符合英文語法規律的新式,比如輸入89會返回“eighty-nine”。本練習中的值假定在0~1000。
Abit = ['zero','one','tow','three','four','five','six','seven','eight','nine',]
Towbit1 = ['ten','eleven','twelve' ,'thirteen','fourteen','fiveteen','sixteen','seventeen','eighteen','nineteen','twenty']
Towbit2 = ['','','twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety']
numstr = raw_input('enter number:')
lennum = len(numstr)
num = int(numstr)
if lennum == 1:
print "You enter number is: %d, English is: %s" %(num,Abit[num])
elif lennum == 2:
if numstr[0] == '1':
print "You enter number is: %d, English is: %s" %(num,Towbit1[num-10])
else:
print "You enter number is: %d, English is: %s" %(num,Towbit2[int(numstr[0])]+'-'+Abit[int(numstr[1])])
elif lennum == 3:
if numstr[1] == '0':
print "You enter number is: %d, English is: %s" %(num,Abit[int(numstr[0])]+'hundred'+'-'+Abit[int(numstr[2])])
else:
print "You enter number is: %d, English is: %s" %(num,Abit[int(numstr[0])]+'.'+'hundred'+'-'+Towbit2[int(numstr[1])]+'-'+Abit[int(numstr[2])])
else:
print "You enter number is: %d, English is: one thousand" %num
6-9. 轉換,為聯絡5-13寫一個姊妹函式,接受分鐘數,返回小時數和分鐘數。總時間不變,而且要求小時數儘可能大。
num = int(raw_input('enter:'))
print "you enter is %d:%d." %(num/60,num%60)
6-10 字串。 寫一個函式,返回一個跟輸入字串相似的字串,要求字串的大小寫反轉。比如輸入'Mr.Ed',應該返回‘mR.eD’作為輸入str1 = raw_input('enter:')
print "you enter is %s.change:%s" %(str1,str1.swapcase())
6-11 轉換。
(a)建立一個從整型到IP地址的轉換,如下格式:www.xxx.yyy.zzz。
(b)更新你的程式,使之可以逆轉換。
不會,搜的別人的答案
我們通常見到的IP地址是:109.151.53.61這種形式。這種形式是由三個小數點隔開的四段數字(十進位制),每段十進位制轉換為二進位制。這個IP地址就是:01101101.10010111.00110101.00000001.十進位制是1838626049(將32位的二進位制一個整體轉換為十進位制),可以通過window自帶的計算器->程式設計師->二進位制->輸入->二進位制來計算。所以我們的任務就是完成兩者之間的轉換。
果IP是W.X.Y.Z格式的,那麼其十進位制是int = 256*256*256*W + 256*256*X+ 256*Y + Z,所以反過來。如果十進位制數有了,則除以256**3的商就是W,餘數除以256**2的商就是X,上步的餘數除以256的商就是Y,最終的餘數就是Z
def int_to_ip(num):
W_ = divmod(num,256**3)
X_ = divmod(W_[1],256**2)
Y_ = divmod(X_[1],256)
Z = Y_[1]
return '.'.join((str(W_[0]),str(X_[0]),str(Y_[0]),str(Z)))
if __name__ == '__main__':
while True:
int2ip = raw_input("Enter a int(q to quit):")
if int2ip == 'q':
break
else:
print int_to_ip(int(int2ip))
(b)
def ip_to_int(ip):
list = ip.split('.')
return int(list[0])*256**3+int(list[1])*256*2+/
int(list[2])*256+int(list[3])
if __name__ == '__main__':
while True:
ip2int = raw_input("Enter an IP(q to quit):")
if ip2int == 'q':
break
else:
print ip_to_int(ip2int)
6-12 字串。
(a)建立一個名字為findchr()的函式,函式宣告如下。
def findchr(string, char)
findchr()要在字串string中查詢字元char,找到就返回該值得索引,否則返回-1。不能用string.*find()或者string.*index()函式和方法。
(b)建立另一個叫rfindchr()的函式,查詢字元char最後一次出現的位置。它跟findchr()工作類似,不過它是從字串的最後開始向前查詢的。
(c)建立第三個函式,名字叫subchr(),宣告如下。
def subchr(string, origchar, newchar)
subchr()跟findchr()類似,不同的是,如果找到匹配的字元就用新的字元替換原先字元。返回修改後的字串。
def findchr(string,char):
result = []
for i,j in enumerate(string):
if j == char:
result.append(i)
print 'the index of char:',result
break
else:
return -1
def rfindchr(string,char):
l = len(string)
for i,j in enumerate(string[::-1]):
if char == j:
result = l-i
return result
break
else:
return -1
def subchr(string, origchar, newchar):
print 'The string is "%s" ,the origchar is "%s" and the char is "%s"' % (string, origchar,newchar)
str_list = list(string)
for i, j in enumerate(str_list):
if origchar == j:
str_list[i] = newchar
result = ''.join(str_list)
return result
if __name__ =="__main__":
print '----(a)-----'
print findchr('dota is the best','i')
print '----(b)-----'
print rfindchr('dota is the best!','t')
print '----(c)-----'
print subchr('I love dota','I','We')
6–13.字串.string 模組包含三個函式,atoi(),atol(),和 atof(),它們分別負責把字串轉換成整數,長整型,和浮點型數字.
從 Python1.5 起,Python 的內建函式 int(),long(),float()也可以做相同的事了, complex()函式可以把字串轉換成複數.
(然而 1,5 之前,這些轉換函式只能工作於數字之上)string 模組中並沒有實現一個 atoc()函式,那麼你來實現一個,atoc(),接受單個字串做引數輸入,
一個表示複數的字串,例如,'-1.23e+4-5.67j',返回相應的複數物件.你不能用 eval()函式,但可以使用 complex()函式,
而且你只能在如下的限制之下使用 complex():complex(real,imag)的 real 和 imag 都必須是浮點值.
別人的答案
def atoc(string):
flag_index = string.rfind('-')
if flag_index <= 0:
flag_index = string.rfind('+')
if flag_index > 0:
real = float(string[0:flag_index])
imag = float(string[flag_index:-1])
return complex(real,imag)
print atoc('-1.23e+4-5.67j')
6-14 隨機數。設計一個“石頭、剪子、布”遊戲,有時又叫“Rochambeau”,你小時候可能玩過,下面是規則。你和你的對手,在同一時間做出特定的手勢,必須是下面一種:石頭、剪子、布。勝利者從下面的規則產生,這個規則本身是個悖論。(a)布包石頭。(b)石頭砸剪子。(c)剪子剪破布。在你的計算機版本中,使用者輸入他/她的選項,計算機找一個隨機選項,然後由你的程式來決定一個勝利者或者平手。注意,最好的演算法是儘量少使用if語句。
import random
print '''Let's play Rochambeau;\n
1:siccsor 2:stone 3:fabric 4:qiut'''
list = ['siccsor','stone','fabric']
while 1:
userchoice = input('entern you choice:')
if userchoice>4 or userchoice<1:
print 'worry enter. enter again!'
continue
elif userchoice == 4:
print 'qiut'
break
else:
compchoice = random.randint(1,3)
if userchoice == compchoice:
print "you enter is:%s,comp enter is:%s,it's draw!" %(list[userchoice-1],list[compchoice-1])
elif (userchoice-compchoice) ==-2 or (userchoice-compchoice) ==1:
print "you enter is:%s,comp enter is:%s,user win!" %(list[userchoice-1],list[compchoice-1])
else:
print "you enter is:%s,comp enter is:%s,computer win!" %(list[userchoice-1],list[compchoice-1])