《Python核心编程》 第六章 序列 - 课后习题

时间:2023-03-08 17:36:27
《Python核心编程》 第六章 序列 - 课后习题

课后习题


6–1.字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分?

答:成员关系操作符(in、not in)

import string
m_string = raw_input('请输入大字符串:')
s_string = raw_input('请输入子字符串:')
if s_string in m_string:
    print '子字符串在大字符串内'

else:
    print "子字符串不在大字符串内"

6–2. 字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 keyword.kwlist)来帮你.

答:

import string
import keyword

alphas = string.letters + '_'
nums = string.digits

print "Welcome to the Identifier Checker V1.0"
print "Pls input the test string"
myInput = raw_input("Identifier to test?\n")
if myInput in keyword.kwlist:
    print "Invalid : The string is keyword"
else:
    if myInput[0] not in alphas:
        print "The string is Not Valid, the first symbol must be letters or '_' "
    else:
        for otherchar in myInput[1:]:
            if otherchar not in alphas + nums:
                print "Invalid: 其余字符串必须是字母、数字或者下划线"
                break
            else:
                print "The test string is Valid"

6–3. 排序 

(a) 输入一串数字,从大到小排列之.
(b) 跟 a 一样,不过要用字典序从大到小排列之.

答:

(a)

test_list = [ ]
while True:
    n = int(raw_input("请输入一些数字,输入0时结束:"))
    if n == 0:
        break
    test_list.append(n)
test_list.sort( reverse=True)
print test_list

(b)

暂时不会


6–4. 算术. 更新上一章里面你的得分测试练习方案,把测试得分放到一个列表中去.你的代码应该可以计算出一个平均分,见练习 2-9 和练习 5-3.

答: 暂时不写


6–5. 字符串
(a)更新你在练习 2-7 里面的方案,使之可以每次向前向后都显示一个字符串的一个字符.
(b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者 cmp()内建函数)。附加题:
Edit By Vheavens
Edit By Vheavens
在你的方案里加入大小写区分.
(c)判断一个字符串是否重现(后面跟前面的一致).附加题:在处理除了严格的回文之外,加入对
例如控制符号和空格的支持。
(d)接受一个字符,在其后面加一个反向的拷贝,构成一个回文字符串.

答:

a

#参考
def showStr(strTemp):
    try:
        num = []
        length = len(strTemp)
        for i in range(length // 2):
            num.append(strTemp[i])
            num.append(strTemp[length - i - 1])
    except IndexError:
        pass
    finally:
        if length % 2 == 1:
            num.append(strTemp[length // 2])
        return num

#if __name__ == "__main__":
while True:
    strTemp = raw_input("please enter the string(-1 to quit):")
    if strTemp == "-1":
        break
    print "the strange string is:"
    print showStr(strTemp)

b

c

d


6–6.字符串.创建一个string.strip()的替代函数:接受一个字符串,去掉它前面和后面的

空格(如果使用 string.*strip()函数那本练习就没有意义了)

答:

(' '.join(source)的作用不只是将列表source中的项目转换为字符串,而是用空格将里面的元素链接起来)

def new_strip(teststr):
    newstr = list(teststr)
    length = len(newstr)
    i = 0
    del newstr[length-1]
    del newstr[i]
    return ''.join(newstr)
print new_strip(' Hello Python ')

6–7. 调试.看一下在例 6.5 中给出的代码(buggy.py) 

(a)研究这段代码并描述这段代码想做什么.在所有的(#)处都要填写你的注释.
(b)这个程序有一个很大的问题,比如输入 6,12,20,30,等它会死掉,实际上它不能处理任何的偶
数,找出原因.
(c)修正(b)中提出的问题.

(不写了)


6–8. 列表.给出一个整数值,返回代表该值的英文,比如输入 89 返回"eight-nine"。附加题:

能够返回符合英文语法规则的形式,比如输入“89”返回“eighty-nine”。本练习中的值限定在 0
到 1,000.

答:

# -*- coding: UTF-8 -*-
'''
Created on 2014年7月1日
6–8. 列表.给出一个整数值,返回代表该值的英文,比如输入 89 返回"eight-nine"。附加题:

能够返回符合英文语法规则的形式,比如输入“89”返回“eighty-nine”。本练习中的值限定在家0 ~ 1,000
@author: User
'''
dict1 = {" : "" }
dict2 = {" : "" }
dict3 = {" : "" }
dictAll = {1: dict1 , 2:dict2 , 3:dict3  }
def fun(strNum):
    if int(strNum)>1000 or int(strNum)<0:
        return "Invalid Number, Please input again"
    length = len(strNum)
    strTemp = ""
    if len(strNum) == 4:
        strTemp = "One Thousand"
        return strTemp
    for i in range(length):
        strTemp += dictAll[length - i][strNum[i]] +" "
    return strTemp

if __name__ == "__main__":
    while True:
        strNum = raw_input("请输入一个数字,按q退出:")
        if strNum.lower() == 'q' :
            break
        print fun(strNum)
        

 6–9. 转换.为练习 5-13 写一个姊妹函数, 接受分钟数, 返回小时数和分钟数. 总时间不

变,并且要求小时数尽可能大.

答:(很笨的方法,没用divmod(a,b))

def minToh(mins):
    hour = int(mins/60)
    minites = mins - 60*hour
    return str(hour) + " :" + str(minites)

if __name__== "__main__" :
    while True:
        mins = int(input("input the minites(q to quit):"))
        if mins == "q":
            break
        print "the result is : " ,minToh(mins)

 6–10.字符串.写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转.

比如,输入"Mr.Ed",应该返回"mR.eD"作为输出.
Example 6.4 有 bug 的程序(buggy.py)
答:

def Str1(testStr):
    result = testStr.swapcase()
    return result

if __name__ == "__main__":
    while True:
        testStr = raw_input("Input your strings(q to quit):")
        if testStr.lower() == "q":
            break
        print Str1(testStr)

 6–11.转换 

(a)创建一个从整数到 IP 地址的转换程序,如下格式: WWW.XXX.YYY.ZZZ.
(b)更新你的程序,使之可以逆转换.

答:

(暂时不懂转换规则)


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):
    length = len(string)
    for i in range(length):
        if string[i] == char:
            return i
    return -1
def rfindchr(string, char):
    length = len(string)
    for i in range(length):
        if string[length - i - 1] == char:
            return length - i - 1
    return -1
def subchr(string, origchar, newchar):
    length_o = len(origchar)
    length_s = len(string)
    newstring = ""
    i=0
    while i < length_s:
        if string[i:i + length_o] == origchar:
            newstring += newchar
            i+=length_o
        else:
            newstring += string[i]
            i += 1
    return newstring  

if __name__ == "__main__":
    print findchr("hello python", "p")
    print findchr("hello python", "m")
    print rfindchr("hello python", "l")
    print rfindchr("hello python", "m")
    print subchr("hellol python","o","+")
    print subchr("hello python","x","?") 

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)
Edit By Vheavens
Edit By Vheavens
的 real 和 imag 都必须是浮点值.

答:


6–14.随机数.设计一个"石头,剪子,布"游戏,有时又叫"Rochambeau",你小时候可能玩过,下面
是规则.你和你的对手,在同一时间做出特定的手势,必须是下面一种手势:石头,剪子,布.胜利者从
下面的规则中产生,这个规则本身是个悖论.
(a) the paper covers the rock,
布包石头.
(b)石头砸剪子,
(c)剪子剪破布.在你的计算机版本中,用户输入她/他的选项,计算机找一个随机选项,然后由你
的程序来决定一个胜利者或者平手.注意:最好的算法是尽量少的使用 if 语句.

答:

import random

def rochambeau(string):
    dict1 = {"  }
    dictall = {" :"lose"   }
    randnum = random.randrange(1,4)
    return "You are : %s"  %dictall[dict1[string]+str(randnum)]

if __name__ == "__main__":
    while True: #这句必须加,否则会报错
        string = raw_input("please input your choose(stone,seear or cloth):(quit by q)")
        if string.lower() == 'q':
            break
        if (string != 'stone') and (string != 'swear') and (string != 'cloth'):
            print "error input"
            continue
        print rochambeau(string)

result:

please input your choose(stone,seear or cloth):(quit by q)cloth
You are : equal
please input your choose(stone,seear or cloth):(quit by q)cloth
You are : equal
please input your choose(stone,seear or cloth):(quit by q)cloth
You are : win

6–15.转换
(a)给出两个可识别格式的日期,比如 MM/DD/YY或者 DD/MM/YY格式,计算出两个日期间的天
数.
(b)给出一个人的生日,计算从此人出生到现在的天数,包括所有的闰月.
(c)还是上面的例子,计算出到此人下次过生日还有多少天.

答:

(暂时想不出来,以后再写)


6–16.矩阵.处理矩阵M和N的加和乘操作.

答:

(暂时想不出来,悲催)


6–17.方法.实现一个叫 myPop()的函数,功能类似于列表的 pop()方法,用一个列表作为输入,
移除列表的最新一个元素,并返回它.

答:  

def myPop(list1):
    del list1[-1]
    return list1

if __name__ == "__main__":
    list1 =[2,3,4,5]
    print myPop(list1)

6–18. zip() 内建函数 在 6.13.2 节里面关于 zip()函数的例子中,zip(fn,ln)返回的是什么?

答: zip返回元组


6–19.多列输出.有任意项的序列或者其他容器,把它们等距离分列显示.由调用者提供数据和

输出格式.例如,如果你传入 100 个项并定义 3 列输出,按照需要的模式显示这些数据.这种情况下,应
该是两列显示 33 个项,最后一列显示 34 个.你可以让用户来选择水平排序或者垂直排序.

答:

第六章暂且这样,后面边学边回头写前面的章节题目