del l ...........若干不相关代码....... _idmapL = None defmaketrans(fromstr, tostr):#接收两个字符串参数 """maketrans(frm, to) -> string Return a translation table (a string of 256 bytes long) suitable for use in string.translate. The strings frm and to must be of the same length. """ if len(fromstr) != len(tostr): #判断长度是否相等 raise ValueError, "maketrans arguments must have same length" global _idmapL ifnot _idmapL: # 第一次初始化,将刚才生成的 ascii 码赋值给它,以后就不需要初始化了。 _idmapL = list(_idmap) L = _idmapL[:] # 复制出来一个新列表,对原有列表操作不影响 fromstr = map(ord, fromstr) # 字符串转 ascii for i in range(len(fromstr)): L[fromstr[i]] = tostr[i] # 将对应位置的 ascii 进行替换 return''.join(L) # 返回根据位置替换后的列表
情景1:
如果 a = ‘aabbcc’, b = ‘123456’ ,生成 c = maketrans(a, b) ,那么替换 a 的结果是: 224466。
如果出现重复的,源码告诉我们,后面的值会覆盖前面的值。
应用
可以用在一些加密的场景之中。
1 2 3 4 5 6 7 8 9 10 11 12
defget_table(key): m = hashlib.md5() m.update(key) s = m.digest() (a, b) = struct.unpack('<QQ', s) table = [c for c in string.maketrans('', '')] # 生成一张 ascii 码列表 for i in xrange(1, 1024): # 混合排序 1024遍 table.sort(lambda x, y: int(a % (ord(x) + i) - a % (ord(y) + i))) return table