1. 程式人生 > >python核心程式設計-第6章課後習題答案

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])