信息加密
By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢。
* 注题目来自:http://www.pythontip.com *
This is my first blog with markdown editor.
描述:
给你个小写英文字符串a和一个非负数b(0<=b<26), 将a中的每个小写字符替换成字母表中比它大b的字母。
这里将字母表的z和a相连,如果超过了z就回到了a。例如a=”cagy”,b=3, 则输出 fdjb
分析:
挨个处理字符串中的每个字符,然后每个字符的ascii码值加b,如果结果大于z的acsii码值,需要取余处理,然后依次输出转变后的字符。
尝试后发现int(‘a’)是会报错的。所以这种方法需要其他函数的帮助。查阅后发现了chr和ord两个内建函数。
chr()函数用一个范围在range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
如:print chr(65) 将输出: ‘A’
ord()函数是chr()函数(对于8位的ASCII字符串)或unichr()函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值,或者Unicode数值,如果所给的Unicode字符超出了你的Python定义范围,则会引发一个TypeError的异常。
如:print ord(‘A’) 将输出: 65
代码
def encrypt(a,b):
ans = ‘‘
for i in range(len(a)):
ans += chr((ord(a[i]) + b - 97)%26 + 97)
print ans
encrypt(a,b)
更pythonic的方式:
print "".join([chr((ord(i) + b - 97)%26 + 97) for i in a])
其他思路
pythontip上的解题报告总是有些让人眼前一亮的方法和代码。
下面这种方法并没有使用将字符转换为acsii码的方式,而是每个字符找到它们在小写字母中的位置(使用在小写字母字符串查找的方式)从而避免了转换。
ff = "abcdefghijklmnopqrstuvwxyz"
f=‘‘
for i in a:
d=(ff.find(i)+b)%26
f=f+ff[d]
print f
使用上面这种思路的更pythonic的方法有:
s = "abcdefghijklmnopqrstuvwxyz"
print "".join(map(lambda c:s[(s.index(c)+b)%26], a))
下面这种方法看了很久才看懂:
首先string.lowercase是所有的小写字母字符串,f等于”abcdefghijklmnopqrstuvwxyz”。
接着,利用了切片操作得到了位移后的小写字符串数组。最后,利用string的maketrans函数进行原顺序的小写字母字符串与位移后的小写字母字符串的对应关系,然后使用string的translate函数将a串中的内容按照maketrans函数给的对应关系进行转换,输出转换后的结果。
import string
f = string.lowercase
t = f[b:] + f[:b]
trans = string.maketrans(f, t)
print str(a).translate(trans)