python核心编程-第6章课后习题答案

时间:2022-01-28 08:41:44

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