《Python核心编程》第二版第七章练习题答案 第二部分

7-9. 翻译
(a) 编写一个字符翻译程序(功能类似于Unix 中的tr 命令)。我们将这个函数叫做tr(),它有
三个字符串做参数: 源字符串、目的字符串、基本字符串,语法定义如下:
def tr(srcstr, dststr, string)
srcstr 的内容是你打算“翻译”的字符集合,dsrstr 是翻译后得到的字符集合,而string 是
你打算进行翻译操作的字符串。举例来说,如果srcstr == 'abc', dststr == 'mno', string ==
'abcdef', 那么tr()的输出将是'mnodef'. 注意这里len(srcstr) == len(dststr).
在这个练习里,你可以使用内建函数chr() 和 ord(), 但它们并不一定是解决这个问题所必不
可少的函数。
(b) 在这个函数里增加一个标志符参数,来处理不区分大小写的翻译问题。

(c)修改你的程序,使它能够处理删除字符的操作。字符串srcstr 中不能够映射到字符串dststr
中字符的多余字符都将被过滤掉。换句话说,这些字符没有映射到dststr 字符串中的任何字符,因
此就从函数返回的字符里被过滤掉了。举例来说:如果 srcstr == 'abcdef', dststr == 'mno',
string == 'abcdefghi', 那么tr()将输出'mnoghi'. 注意这里len(srcstr) >= len(dststr).

解答:

 

#!/usr/bin/python
# -*- coding:utf-8 -*- 
#Filename:7-9.py
'''
Created on 2012-8-6

@author: wanglei
'''
def tr_ig(srcstr,dststr,string,ignore=True):#默认忽略大小写
    srclen=len(srcstr)
    dstlen=len(dststr)
    assert(srclen==dstlen)
    stringlist=list(string)
    if(ignore==True):
        for i in range(srclen):
            for j in range(len(string)):
                if srcstr[i]==string[j]:
                    stringlist[j]=dststr[i]
    else:
        for i in range(srclen):
            for j in range(len(string)):
                if srcstr[i].upper()==string[j].upper():
                    stringlist[j]=dststr[i]
    newstring=''.join(stringlist)
    return newstring 
def tr_delete(srcstr,dststr,string):#将长度不等的后面的字符去掉后再调用tr_ig方法
    srclen=len(srcstr)
    dstlen=len(dststr)
    tmplist=list(srcstr)
    newsrcstr=''.join(tmplist[0:dstlen])
    resultstr=tr_ig(newsrcstr,dststr,string)
    return resultstr
#srcstr=raw_input("请输入要翻译的字符集合: ")
#dststr=raw_input("请输入翻译后得到的字符集合: ")
#string=raw_input("请输入要转换的原始字符串: ")
print "转换后的新新字符串为: %s"%tr_ig('abc','mno','abcdef')
print "转换后的新新字符串为: %s"%tr_ig('abc','Mno','aBcDef',False)
print "转换后的新新字符串为: %s"%tr_delete('abcdef','mno','abcdef')

 

输出:

转换后的新新字符串为: mnodef
转换后的新新字符串为: MnoDef
转换后的新新字符串为: mnodef

7–10. 加密。
(a) 用上一个练习的思路编写一个"rot13"翻译器。"rot13"是一个古老而又简单的加密方法,
它把字母表中的每个字母用其后的第13 个字母来代替。字母表中前半部分字母将被映射到后半部分,
而后半部分字母将被映射到前半部分,大小写保持不变。举例来说,'a'将被替换为'n','X'将被替
换为'K'; 数字和符号不进行翻译。
(b)在你的解决方案的基础上加一个应用程序,让它提示用户输入准备加密的字符串(这个算法
同时也可以对加密后的字符串进行解密)

解答:

 

#!/usr/bin/python
# -*- coding:utf-8 -*- 
#Filename:7-10.py
'''
Created on 2012-8-6

@author: wanglei
'''
def rot13(str):
    strlist=[]
    for s in str:
        if s.isalpha():
            strnum=ord(s)
            if (65<=strnum<78) or (97<=strnum<110):
                strlist.append(chr(strnum+13))
            elif (78<=strnum<=90) or (110<=strnum<=122):
                strlist.append(chr(strnum-13))
        else:
            strlist.append(s)
    return ''.join(strlist)
string='This is a short sentence.'
print rot13(string)

 

输出:

Guvf vf n fubeg fragrapr.

 

 

 

posted on 2012-08-06 15:30  温柔的暴力  阅读(1805)  评论(1编辑  收藏  举报

导航