您的位置:首页 > 编程语言 > Python开发

<Python核心编程(第二版)>第六章练习题

2017-03-10 17:56 197 查看
1. 字符串. string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下字符串是否是另一个大字符串的一部分?

in

2. 字符串标识符. 修改例6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且可以识别 python 关键字.

对后一个要求,你可以使用 keyword 模块(特别是 keyword.kwlist) 来辅助.

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

import string,keyword

alphas = string.letters + '_'

nums = string.digits

print "Welcome to the Identifier Checker v1.0"

myInput = raw_input("Identifier to test? ")

if myInput in keyword.kwlist[:]:

print """ invalid: is a keyword """

else:

if myInput[0] not in alphas:

print """ invalid: first symbol must be alphabetic """

else:

for otherChar in myInput[1:]:

if otherChar not in alphas + nums:

print """ invalid: remaining symbols must be alphanumeric """

break

else:

print "okay as an identifier"

3. 排序.

a). 输入一串数字,并从大到小排列之;

b). 跟a一样,不过要用字典序从大到小排列.

a).

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

aNumber = raw_input("Please Enter a number,split with ','\n")

nuList = []

for anu in aNumber.split(",")[:]:

nuList.append(int(anu))

nuList.sort(reverse=True)

print nuList

b).

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

def sortDict (aDict):

values = aDict.values()

values.sort(reverse=True)

print values

if __name__ == "__main__":

aDict = {'a':1,'d':4,'e':2,'b':3,'c':5,'f':6,'g':7}

sortDict (aDict)

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

分,见练习 2-9 和 练习 5-3

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

gradeList = []

listSum = 0

while True:

aScore = raw_input("Please Enter your point:\n")

if aScore == "-1":

break

gradeList.append(float(aScore))

listSum += float(aScore)

print "the average Score is %.2f" % (listSum/len(gradeList))

5. 字符串

a). 更新你在练习 2-7 里面的方案,使之可以每次向前向后都显示一个字符串的一个字符.

b). 通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者cmp()内建函数).

附加题: 在你的方案里加入区分大小写.

c). 判断一个字符串是否重现(后面跟前面的一致). 附加题: 在处理了严格的回文之外,加入对例如控制符号和空

格的支持.

d). 接受一个字符, 在其后面加一个反向的拷贝, 构成一个回文字符串.

a).

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

if __name__ == "__main__":

aString = raw_input("Please Enter a String ...\n")

for lNum in xrange(len(aString)):

print "left %d Letter is %s, and right %d Letter is %s" % (lNum,aString[lNum],lNum,aString[::-1][lNum])

b).

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

aString = raw_input("Enter a String as string A\n")

bString = raw_input("Enter a String as string B\n")

signBit = 0

if len(aString) != len(bString):

signBit = 1

else:

for lett in xrange(len(aString)):

if aString[lett] != bString[lett]:

signBit = 1

if signBit == 1:

print "not the same String ..."

else:

print "The same String ..."

#"not the same String ..." if signBit == 1 else "The same String ..."

c),d) 看不明白题目意思

6. 字符串. 创建一个 string.strip() 的替代函数: 接受一个字符串,去年它前面和后面的空格(如果使用

string.*strip()函数, 那本练习就没有意义了)

着重注意题意是 "去掉前面和后面的空格"

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

def myStrip(aString):

finalString = aString[1:-1]

return finalString

aString = raw_input("Please Enter a String: \n")

if aString.startswith(" ") and aString.endswith(" "):

print myStrip(aString)

else:

print "String Must begin and end with space ..."

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

#!/usr/bin/env python

## 输入一个数字

num_str = raw_input('Enter a number: ')

## 将输入的数字转为字符类型

num_num = int(num_str)

## 定义 fac_list 为,以输入的数字作为临界的列表

fac_list = range(1,num_num+1)

print "BEFORE:", fac_list

## 定义 i 的初始值为 0

i = 0

## 以 i 小于列表长度作为循环条件

while i < len(fac_list):

## 当 输入的数字能 被 列表中的元素 整除时, 将其踢除出列表

if num_num % fac_list[i] == 0:

del fac_list[i]

## i 自加

i = i + 1

## 打印循环处理后的列表

print "AFTER:",fac_list

a). 研究这段代码并描述这段代码想做什么. 在所有的(#) 处都要填写你的注释.

b). 这个程序有一个很大的问题, 比如输入6,12,20,30等,它会死掉. 实际上它不能处理任何的偶数.找出原因

c). 修正 b) 中提出的问题.

b). 应该是不能处理任何数字,程序没有把 fac_list 当成变量,而是当成字符串处理了

a),c). 见以上代码

8. 列表. 给出一个整型值, 返回代表该值的英文, 比如输入 89 返回 "eight-nine". 附加题:能够返回符合英文

语法规则的形式,比如输入 输入 89 返回 "eighty-nine". 本练习中的值限定在0-1000.

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

myRule = {0:'zero',1:'one',2:'two',3:'three',4:'four',5:'five',6:'six',7:'seven',8:'eight',9:'nine',10:'ten',11:'eleven',12:'twelve',13:'thirteen',14:'fourteen',15:'fifteen',16:'sixteen',17:'seventeen',18:'eighteen',19:'nineteen',20:'twenty',30:'thirty',40:'forty',50:'fifty',60:'sixty',70:'seventy',80:'eighty',90:'ninety',100:'hundred',1000:'thousand'}

def convNu2En (number):

convNu = ""

number = int(number)

if number <= 19:

convNu = myRule[number]

return convNu

elif number < 100:

convNu = myRule[number // 10 * 10]

unit = convNu2En(str(number)[-1])

convNu += "-" + unit

#convNu = convNu + "-" + unit

return convNu

else:

bits = len(str(number)) - 1

if bits <= 2:

bits = 2

elif bits <= 3:

bits = 3

firstBit = 10 ** bits

convNu = convNu2En(str(number)[:-bits]) + " " + myRule[firstBit]

otherBit = convNu2En(str(number)[-bits:])

if bits == 2:

convNu += " and "

else:

convNu += ","

convNu += otherBit

return convNu

if __name__ == "__main__":

import sys

number = sys.argv[1]

print convNu2En (number)

9. 转换. 为练习 5-13 写一个姐妹函数, 接受分钟数, 返回小时数和分钟数. 总时间不变,并且要求小时数尽可能大.

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

mins = int(raw_input("Enter a Number: \n"))

print "%d%s%d" % (divmod(mins,60)[0],":",divmod(mins,60)[1])

10. 字符串. 写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转. 比如,输入 "Mr.Ed", 应该

返回 "mR.eD" 作为输出.

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

myString = raw_input("Enter a String: \n")

for lett in xrange(len(myString)):

if myString[lett].isupper():

myString = "%s%s%s" % (myString[:lett],myString[lett].lower(),myString[lett+1:])

elif myString[lett].islower():

myString = "%s%s%s" % (myString[:lett],myString[lett].upper(),myString[lett+1:])

else:

pass

print myString

发现有这么一个东东 swapcase(...), 专门实现这个功能,代码简洁多了

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

def myChang(myString):

return myString.swapcase()

myString = raw_input("Enter a String: \n")

print myChang(myString)

11. 转换.

a). 创建一个从整型到IP地址的转换程序,如下格式: WWW.XXX.YYY.ZZZ

b). 更新你的程序,使之可以逆转转换.

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

def int2ip(myNumber):

dotBitIP = ''

for dotBit in xrange(3,-1,-1):

dotBitIP = dotBitIP + str(myNumber / (256 ** dotBit)) + "."

if dotBit == 3 and int(dotBitIP.rstrip('.')) > 255:

print "Invalid IP,please enter another number ..."

sys.exit(1)

#print dotBit,dotBitIP

myNumber = myNumber % (256 ** dotBit)

return(dotBitIP.rstrip('.'))

if __name__ == "__main__":

import sys

myNumber = int(sys.argv[1])

print int2ip (myNumber)

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() 类似, 不同的是, 如果找到匹配的字符就用新的字符替换原先字符.返回修改后的字符.

a).

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

def findchr (aString,myChar):

if myChar not in aString:

print "-1"

else:

charLength = len(myChar)

i = 0

while i < len(aString):

if aString[i:i+charLength] == myChar:

print i

i += 1

if __name__ == "__main__":

aString = raw_input('Please Enter a string ... ')

myChar = raw_input('Please Enter a string or char ... ')

findchr(aString, myChar)

b).

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

def findchr (aString,myChar):

if myChar not in aString:

print "-1"

else:

charLength = len(myChar)

i = 0

resultList = []

while i < len(aString):

if aString[i:i+charLength] == myChar:

resultList.append(i)

i += 1

print "last appear @ %d" % resultList[-1]

if __name__ == "__main__":

aString = raw_input("Enter a string ... ")

myChar = raw_input("Enter a string or char ... ")

findchr(aString, myChar)

c).

#!/usr/bin/env python

## -*- coding: UTF -*-

## Author:

def subchr(myString,origChar,newChar):

if origChar not in myString:

print "-1"

else:

print myString.replace(origChar,newChar)

if __name__ == "__main__":

myString = raw_input("Enter a string ...")

origChar = raw_input("Enter a string or char will be replaced ...")

newChar = raw_input("Enter a string or char to relace ...")

subchr(myString,origChar,newChar)

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 都必须是浮点值.

14. 随机数. 设计一个"石头,剪子,布"游戏,有时又叫"Rochambeau", 你小时候可能玩过,下面是规则. 你和你的对手, 在同一

时间做出特定的手势,必须是下面一种: 石头,剪子,布. 胜利者从下面规则中产生,这个规则本身是个悖论.

a). 布 包 石头;

b). 石头 砸 剪子

c). 剪子 剪破 布.

在你的计算机版本中, 用户输入她/他的选项, 计算机找一个随机选项,然后由你的程序来决定一个胜利者或者平手.

注意: 最好的算法是尽量少的使用if语句.

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

import random

player = {1:'stone',2:'scissors',3:'cloth'}

judge = {('stone','scissors'): 'Win',('stone','cloth'): 'Lose',('stone','stone'): 'draw',('scissors','cloth'): 'Win',('scissors','stone'):'Lose',('scissors',

'scissors'):'draw',('cloth','stone'):'Win',('cloth','scissors'):'Lose',('cloth','cloth'):'draw',}

def gStart ():

pcChoice = player[random.choice(range(1,3))]

print player,"Please choose ..."

myChoice = player[int(raw_input('Enter Your choice>:'))]

print "Your choice is \033[1;31;32m%s\033[0m, Computer's choice is \033[1;31;32m%s\033[0m, and you \033[1;31;31m%s\033[0m" % (myChoice,pcChoice,judge[myC

hoice,pcChoice])

def main():

while True:

gStart ()

try:

goAgain = raw_input("Start again ?[y/n]").lower()

if goAgain and goAgain[0] == "n":

break

except (KeyboardInterrupt,EOFError):

break

if __name__ == "__main__":

main()

15. 转换.

a). 给出两个可识别格式的日期, 比如MM/DD/YY 或者 DD/MM/YY 格式, 计算出两个日期间的天数.

b). 给出一个人的生日, 计算从此人出生到现在的天数,包括所有的闰月.

c). 还是上面的例子,计算出此人下次过生日还有多少天.

a).

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

def convertDate (allDate):

aYear = int(allDate.split("/")[-1])

aMonth = int(allDate.split("/")[0])

aDay = int(allDate.split("/")[1])

return (aYear,aMonth,aDay)

if __name__ == "__main__":

import datetime

Dt = raw_input("Enter a date ...\n")

D1 = datetime.date(convertDate(Dt)[0],convertDate(Dt)[1],convertDate(Dt)[2])

Dt = raw_input("Enter another date ...\n")

D2 = datetime.date(convertDate(Dt)[0],convertDate(Dt)[1],convertDate(Dt)[2])

print (D2 - D1).days

b).

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

def convertDate (allDate):

aYear = int(allDate.split("/")[-1])

aMonth = int(allDate.split("/")[0])

aDay = int(allDate.split("/")[1])

return (aYear,aMonth,aDay)

if __name__ == "__main__":

import datetime

birthTime = raw_input("Enter Your borth date ...\n")

D1 = datetime.date(convertDate(birthTime)[0],convertDate(bothTime)[1],convertDate(birthTime)[2])

print (datetime.date.today() - D1).days

c).

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

def convertDate (allDate):

aYear = int(allDate.split("/")[-1])

aMonth = int(allDate.split("/")[0])

aDay = int(allDate.split("/")[1])

return (aYear,aMonth,aDay)

if __name__ == "__main__":

import datetime,time

birthTime = raw_input("Enter Your borth date ...\n")

if convertDate(birthTime)[1] > int(time.strftime('%m')):

nextBirth = datetime.date(int(time.strftime('%Y')),convertDate(birthTime)[1],convertDate(birthTime)[2])

elif convertDate(birthTime)[1] == int(time.strftime('%m')):

if convertDate(birthTime)[2] > int(time.strftime('%d')):

nextBirth = datetime.date(int(time.strftime('%Y')),convertDate(birthTime)[1],convertDate(birthTime)[2])

else:

nextBirth = datetime.date(int(time.strftime('%Y')) + 1,convertDate(birthTime)[1],convertDate(birthTime)[2])

else:

nextBirth = datetime.date(int(time.strftime('%Y')) + 1,convertDate(birthTime)[1],convertDate(birthTime)[2])

print (nextBirth - datetime.date.today()).days

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

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

并返回它.

#!/usr/bin/env python

## -*- coding: UTF-8 -*-

## Author:

aList = []

def myPop ():

if len(aList) == 0:

print "You can't pop from an empty list ..."

else:

dEle = aList[-1]

#aList = aList[:-1]

print "Removed [",dEle,"]"

aList.remove(dEle)

#return aList[:-1]

def addEle ():

aList.append(raw_input("Enter a String ...").strip())

def viewList ():

print aList

actions = { 'a':addEle, 'v':viewList, 'd':myPop }

def theMenu ():

mBanner = """

(A)dd ele

(V)iew ele

(D)el ele

(Q)uit

Enter your choice: """

while True:

try:

yChoice = raw_input(mBanner).strip()[0].lower()

except (EOFError,KeyboardInterrupt,IndexError):

yChoice = "q"

print "\nYou picked [%s]" % yChoice

if yChoice not in 'avdq':

print "Invalid choice,try again ..."

if yChoice == "q":

break

actions[yChoice]()

if __name__ == "__main__":

theMenu ()

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

#!/usr/bin/env python

## -*- UTF-8 -*-

## Author:

fn = ['ian','stuart','david']

ln = ['bairnson','elliott','paton']

for i,j in zip(fn,ln):

print ("%s %s" % (i,j)).title()

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

你传入 100 个项并定义3列输出, 按照需要的模式显示这些数据. 这种情况下,应该是两列显示33个项,最后一列

显示34个. 你可以让用户选择水平排序或者垂直排序.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python基础知识