6–1. 字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分?
>>> a='t'
>>> b='letters'
>>> a in b
True
>>> b.find(a)
2
>>> b.index(a)
2
>>> b.rfind(a)
3
>>> b.rindex(a)
3
6–2. 字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为1的标识符,并且可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 keyword.kelist)来帮你.
import string
import keyword
alphas = string.letters + '_'
nums = string.digits
print 'Welcome to the Identifier Checker v2.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 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:
if myInput in keyword.kwlist:
print '''invalid: symbols can't be a keyword of python'''
else:
print "okay as an identifier"
6–3. 排序
(a) 输入一串数字,从大到小排列之.
input_nums=raw_input('Please input numbers: ')
nums=[]
for n in input_nums:
nums.append(n)
nums.sort()
nums.reverse()
print ''.join(nums)
感觉写的很繁琐,在QQ群里一问有人写出以下代码
input_nums=raw_input('Please input numbers: ')
print ''.join(sorted(list(input_nums), reverse=True))
(b) 跟 a 一样,不过要用字典序从大到小排列之. (Do the same thing, but for strings and in reverse alphabetical (largest-to-smallest lexicographic) order.)
没搞懂,字符串排序不就是这样排的吗?
6–4. 算术. 更新上一章里面你的得分测试练习方案,把测试得分放到一个列表中去.你的代码应该可以计算出一个平均分,见练习 2-9 和练习 5-3.
#2-9 代码
list1=[1,2,3,4,5]
sum =0
for i in list1:
sum+=i
avg = float(sum/len(list1)) #当时这样写看来是不对的
print avg
#5-3 代码
def judge(score):
if 90<=score<=100:
return 'A'
elif score>=80:
return 'B'
elif score>=70:
return 'C'
elif score>=60:
return 'D'
else:
return 'F'
list1=[1,2,3,4,5]
avg = float(sum(list1))/len(list1)
print avg
6–5. 字符串
(a)更新你在练习 2-7 里面的方案,使之可以每次向前向后都显示一个字符串的一个字符.
不管是中文还是英文,这个题目我都没搞懂
(b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者 cmp()内建函数)。附加题:在你的方案里加入大小写区分.
#来源于网络
def is_same(first_string, second_string):
if len(first_string) is not len(second_string):
return False
else:
for i in range(len(first_string)):
if first_string[i] is not second_string[i]:
return False
return True
(c)判断一个字符串是否重现(后面跟前面的一致).附加题:在处理除了严格的回文之外,加入对例如控制符号和空格的支持。
暂时不会
(d)接受一个字符,在其后面加一个反向的拷贝,构成一个回文字符串.
def add_reverse(a_str):
return a_str+a_str[::-1]
6–6. 字符串.创建一个 string.strip()的替代函数:接受一个字符串,去掉它前面和后面的空格(如果使用 string.*strip()函数那本练习就没有意义了)
def strip(string):
while string[0]==' ':
string=string[1:]
while string[-1]==' ':
string=string[:-1]
return string
6–7. 调试.看一下在例 6.5 中给出的代码(buggy.py)
(a)研究这段代码并描述这段代码想做什么.在所有的(#)处都要填写你的注释.
(b)这个程序有一个很大的问题,比如输入 6,12,20,30,等它会死掉,实际上它不能处理任何的偶数,找出原因.
(c)修正(b)中提出的问题.
'''参考网络代码'''
# 提醒用户输入一个数字
num_str = raw_input('Enter a number: ')
# 把输入的字符串转化为整数
num_num = int(num_str)
# 生成一个列表
fac_list = range(1, num_num+1)
print "BEFORE:", `fac_list`#bug1
# 初始化
i = 0
# 循环判断
while i < len(fac_list):
# 找出约束,bug2
if num_num % fac_list[i] != 0:
del fac_list[i]
continue
# bug3
i = i + 1
# bug4
print "AFTER:", `fac_list`
6–8. 列表.给出一个整数值,返回代表该值的英文,比如输入 89 返回”eight-nine”。附加题:能够返回符合英文语法规则的形式,比如输入“89”返回“eighty-nine”。本练习中的值限定在家 0到 1,000.
"""参考网上代码"""
dict1 = {"1" :"one" , "2" : "two" , "3" : "three" , "4" : "four" , "5" : "five" ,"6" : "six", "7" : "seven" , "8" : "eight" , "9" : "nine", "0" : "" }
dict2 = {"1" :"ten" , "2" : "twenty" , "3" : "thirty" , "4" : "forty" , "5" : "fifty" ,"6" : "sixty", "7" : "seventy" , "8" : "eighty" , "9" : "ninety", "0" : "" }
dict3 = {"1" :"one hundred" , "2" : "two hundred" , "3" : "three hundred" , "4" : "four hundred" , "5" : "five hundred" ,"6" : "six hundred", "7" : "seven hundred" , "8" : "eight hundred" , "9" : "nine hundred", "0" : "" }
dictAll={ 1: dict1 ,2: dict2 , 3: dict3 }
def fun(strNum):
if int (strNum)>1000 or int(strNum)<0:
return "Invalid Number,Plase 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 写一个姊妹函数, 接受分钟数, 返回小时数和分钟数. 总时间不变,并且要求小时数尽可能大.
'''没想出来分钟是个位时怎么输出0:00的格式'''
def change_time():
time=int(raw_input("input a time (minutes) : "))
after_time=divmod(time,60)
print "%d:%d"% (after_time[0],after_time[1])
6–10.字符串.写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转.比如,输入”Mr.Ed”,应该返回”mR.eD”作为输出.
'''参考网上代码'''
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)
Example 6.4 有 bug 的程序(buggy.py)
这是一个用于练习 6-7 的程序,判断这个程序是干什么的,在”#”处添加你的注释,找出其中的错
误,并修改之.
#!/usr/bin/env python
#
num_str = raw_input('Enter a number: ')
#
num_num = int(num_str)
#
fac_list = range(1, num_num+1)
print "BEFORE:", 'fac_list'
#
i = 0
#
while i < len(fac_list):
#
if num_num % fac_list[i] == 0:
del fac_list[i]
#
i = i + 1
#
print "AFTER:", 'fac_list'
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()函数和方法
def findchr(string, char):
index = -1
for i, ch in enumerate(string):
if (ch == char):
index = i
break
return index
(b)创建另一个叫 rfindchr()的函数,查找字符 char 最后一次出现的位置.它跟 findchr()工作类似,不过它是从字符串的最后开始向前查找的.
def rfindchr(string, char):
index = -1
for i, ch in enumerate(string[::-1]):
if (ch == char):
index = len(string)-i-1
break
return index
(c)创建第三个函数,名字叫 subchr(),声明如下:
def subchr(string, origchar, newchar)
subchr()跟 findchr()类似,不同的是,如果找到匹配的字符就用新的字符替换原先字符.返回修改后的字符串.
def subchr(string,origchar,newchar):
s=''
for ch in string:
if ch == origchar:
s+=newchar
else:
s+= ch
return s
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):
index = max(string.rfind('+'), string.rfind('-'))
if index > 0:
if string[index-1] == 'e':
index = max(string.rfind('+', 0, index-1), string.rfind('-', 0, index-1))
real = float(string[0:index])
imag = float(string[index:len(string)-1])
else:
if 'j' in string:
real = 0
imag = float(string[0:len(string)-1])
else:
real = float(string)
imag = 0
return complex(real, imag)
6–14.随机数.设计一个”石头,剪子,布”游戏,有时又叫”Rochambeau”,你小时候可能玩过,下面是规则.你和你的对手,在同一时间做出特定的手势,必须是下面一种手势:石头,剪子,布.胜利者从下面的规则中产生,这个规则本身是个悖论.
(a) 布包石头.
(b)石头砸剪子,
(c)剪子剪破布.
在你的计算机版本中,用户输入她/他的选项,计算机找一个随机选项,然后由你的程序来决定一个胜利者或者平手.注意:最好的算法是尽量少的使用 if 语句.
'''网上抄的'''
import random
def rochambeau(string):
dict1 = {"stone" : "1" ,"swear" :"2" ,"cloth":"3" }
dictall = {"11" :"equal" ,"12" :"win" ,"13" :"lose" ,"22":"equal" ,"23" :"win" ,"21" :"lose" ,"33":"equal" ,"31":"win" ,"32" :"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)
6–15.转换
(a)给出两个可识别格式的日期,比如 MM/DD/YY 或者 DD/MM/YY 格式,计算出两个日期间的天数.
(b)给出一个人的生日,计算从此人出生到现在的天数,包括所有的闰月.
(c)还是上面的例子,计算出到此人下次过生日还有多少天.
我已经崩溃了,为了不打击学习热情,这些题目就放了她吧
6–16.矩阵.处理矩阵 M 和 N 的加和乘操作.
6–17.方法.实现一个叫 myPop()的函数,功能类似于列表的 pop()方法,用一个列表作为输入,移除列表的最新一个元素,并返回它.
6–18. zip() 内建函数 在 6.13.2 节里面关于 zip()函数的例子中,zip(fn,ln)返回的是什么?
#zip()返回元组
6–19.多列输出.有任意项的序列或者其他容器,把它们等距离分列显示.由调用者提供数据和输出格式.例如,如果你传入 100 个项并定义 3 列输出,按照需要的模式显示这些数据.这种情况下,应该是两列显示 33 个项,最后一列显示 34 个.你可以让用户来选择水平排序或者垂直排序.