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

本篇博客主要探讨Python编程中与字符串和列表相关的练习题,包括字符串标识符检查、排序算法、算术计算、字符串操作以及IP地址与十进制的转换等。通过这些实践题目,读者可以深入理解Python语言的常用操作和数据结构应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值