首页
IT
登录
6mi
u
盘
搜
搜 索
IT
<Python核心编程(第二版)>第六章练习题
<Python核心编程(第二版)>第六章练习题
xiaoxiao
2021-03-25
100
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
个. 你可以让用户选择水平排序或者垂直排序.
转载请注明原文地址: https://ju.6miu.com/read-23812.html
技术
最新回复
(
0
)