python核心编程课后题第二版第六章160页
参考资料:balian的笔记http://www.cnblogs.com/balian/archive/2011/02/04/1949107.html
6-1.
字符串。string模块中是否有一种字符串方法或者函数可以帮我鉴定下一个字符串是否是另一个大字符串的一部分?
答:
in,index(),find()都可以,rfind(),rindex()也可以。
a = 'ke' b = 'keyword' print a in b print b.find(a) print b.index(a) print b.rfind(a) print b.rindex(a)
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 'Testees must be at least 2 chars long.' myInput = raw_input('Identifier to test?\n>>') if len(myInput) >= 1: if myInput[0] not in alphas: print '''invalid: first symbol must be alphabetic''' elif myInput in keyword.kwlist: print 'The word inputed is used.' else: for otherChar in myInput[1:]: if otherChar not in alphas + nums: print '''invalid: first symbol must be alphabetic''' break else: print 'okay as an identifier'
注:书中又出错了,应该是keyword的kwlist模块,而不是kelist!!!
【参考】关于keyword.kwlist >>> import keyword >>> dir(keyword) ['__all__', '__builtins__', '__doc__', '__file__', '__name__', 'iskeyword', 'kwlist', 'main'] >>> keyword.kwlist ['and', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'yield']
6-3.
排序。
(a)输入一串数字、并从大到小排列之。
(b)跟a一样。不过要用字典序从大到小排列。
(a)
nums = raw_input('Enter the list of numbers, separated by blank, such as "4 8 9"') n = nums.split() n.sort() print n[::-1]
注:使用了切片中的反序
另一种:
nums = raw_input('Enter the list of numbers, separated by blank, such as "4 8 9"') n = nums.split() n.sort() n.reverse() print n
注:使用了list的reverse()反序。
(b)字典序不知道为何物
6-4.
算术。更新上一章里面你的得分测试联系方案,把测试得分放到一个列表中去。你的代码应该可以计算出一个平均分,见练习2-9和5-3。
暂无。
6-5.
字符串。
(a)更新你在练习2-7里面的方案,使之可以每次向前向后都显示一个字符串的一个字符。
(b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者cmp()内建函数)。
附加题:在你的方案里加入大小写区分。
(c)判断一个字符串是否重现(后面跟前面一致)。附加题:在处理除了严格的回文之外,加入对例如控制符号和空格的支持。
(d)接受一个字符串,在其后面加一个反向的拷贝,构成一个回文字符串。
暂无
6-6.
字符串。创建一个string.strip()的替代函数:接受一个字符串,去掉它前面和后面的空格(如果使用string.*strip()函数那本练习就没有意义了)
def lst(s): l = len(s) for n in range(0, l): if s[n] != ' ': s = s[n:] break return s def rst(s): s = s[::-1] #print s s = lst(s) s = s[::-1] return s def st(s): s = rst(s) s = lst(s) return s s = ' taitan ' s = st(s) print s
注:采用了讨巧的方法,只做了一个lst(去掉左侧空格),然后右侧和左右都利用了这个函数。如果是右侧还可以使用range(10, 0, -1)这样倒序遍历的方法实现,这里就不赘述了。
补充:晚上跟老婆讨论这个程序,她提示我这个有点低,因为2次反转需要更多的空间和时间去操作,还是之前的本方法,从最末尾到前面遍历的方法高效一些,于是又写了一下:
def lst(s): for i, t in enumerate(s): if t != ' ': s = s[i:] break return s def rst(s): l = len(s) for n in range(l-1, 0, -1): if s[n] != ' ': s = s[:n] break return s def st(s): s = lst(s) s = rst(s) return s s = ' sfas ' print st(s) + '1'
6-7.
调试。看一下在例6.5中给出的代码(buggy.py)
(a)研究这段代码并描述这段代码想做什么。在所有的(#)处填写你的注释。
(b)这个程序有一个很大的问题,比如输入6、12、20、30等它会死掉,实际上它不能处理任何的偶数,找出原因。
(c)修正(b)中提出的问题。
暂无。
6-8.
列表。给出一个整型值,返回代表该值得英文,比如输入89会返回“eight-nine”。附加题:能够返回符合英文语法规律的新式,比如输入89会返回“eighty-nine”。本练习中的值假定在0~1000。
def numToEng(num): numlen = len(num) s = [] eng = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] for n in range(0, numlen): s.append(eng[int(num[n])]) return '-'.join(s) num = raw_input('Enter the number>>') print numToEng(num)