Python 的 maketrans 和 translate到底是什么?怎么使用?

刚在在看 Python 的 string 模块,在里面看到了下面这两个函数:

def translate(s, table, deletions=""):
if deletions or table is None:
return s.translate(table, deletions)
else:
return s.translate(table + s[:0])
_idmapL = None
def maketrans(fromstr, tostr):
if len(fromstr) != len(tostr):
raise ValueError, "maketrans arguments must have same length"
global _idmapL
if not _idmapL:
_idmapL = list(_idmap)
L = _idmapL[:]
fromstr = map(ord, fromstr)
for i in range(len(fromstr)):
L[fromstr[i]] = tostr[i]
return ''.join(L)

这两个函数都是联系在一起使用的,首先由 maketrans(fromstr,tostr) 函数来创建用来 translate 的 table,然后我们才能对某一个字符串使用 translate 函数,而 translate 函数其实就是对内置的字符串函数 translate 的调用。

在更详细的了解 maketrans 函数之前,我们可以先来了解这个函数所使用到的一些数据,由 string.py 这个文件可以找到 global _idmapL 默认的值为 None,然后使用了下面这一行代码:

_idmapL = list(_idmap)

继续往上追踪,找到了下面这三行代码:

l = map(chr, xrange(256))
_idmap = str('').join(l)
del l

这个时候,我们就可以知道,_idmapL 最终会是什么样的值的了,其值如下:

['x00', 'x01', 'x02', 'x03', 'x04', 'x05', 'x06', 'x07', 'x08', 't', 'n', 'x0b', 'x0c', 'r', 'x0e', 'x0f', 'x10', 'x11', 'x12', 'x13', 'x14', 'x15', 'x16', 'x17', 'x18', 'x19', 'x1a', 'x1b', 'x1c', 'x1d', 'x1e', 'x1f', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'x7f', 'x80', 'x81', 'x82', 'x83', 'x84', 'x85', 'x86', 'x87', 'x88', 'x89', 'x8a', 'x8b', 'x8c', 'x8d', 'x8e', 'x8f', 'x90', 'x91', 'x92', 'x93', 'x94', 'x95', 'x96', 'x97', 'x98', 'x99', 'x9a', 'x9b', 'x9c', 'x9d', 'x9e', 'x9f', 'xa0', 'xa1', 'xa2', 'xa3', 'xa4', 'xa5', 'xa6', 'xa7', 'xa8', 'xa9', 'xaa', 'xab', 'xac', 'xad', 'xae', 'xaf', 'xb0', 'xb1', 'xb2', 'xb3', 'xb4', 'xb5', 'xb6', 'xb7', 'xb8', 'xb9', 'xba', 'xbb', 'xbc', 'xbd', 'xbe', 'xbf', 'xc0', 'xc1', 'xc2', 'xc3', 'xc4', 'xc5', 'xc6', 'xc7', 'xc8', 'xc9', 'xca', 'xcb', 'xcc', 'xcd', 'xce', 'xcf', 'xd0', 'xd1', 'xd2', 'xd3', 'xd4', 'xd5', 'xd6', 'xd7', 'xd8', 'xd9', 'xda', 'xdb', 'xdc', 'xdd', 'xde', 'xdf', 'xe0', 'xe1', 'xe2', 'xe3', 'xe4', 'xe5', 'xe6', 'xe7', 'xe8', 'xe9', 'xea', 'xeb', 'xec', 'xed', 'xee', 'xef', 'xf0', 'xf1', 'xf2', 'xf3', 'xf4', 'xf5', 'xf6', 'xf7', 'xf8', 'xf9', 'xfa', 'xfb', 'xfc', 'xfd', 'xfe', 'xff']

同样, L 的值也是上面这样的。

然后下面的一行:

fromstr = map(ord,fromstr)

会将传入的参数 fromstr 的值转换成为 ASCII 码的一个 list,比如我们传入的 fromstr 为 fromstr = 'hi python',那么转换之后会得到下面这个值:

>>> fromstr = map(ord,'hi python')
>>> fromstr
[104, 105, 32, 112, 121, 116, 104, 111, 110]

接着的一个 for 循环:

for i in range(len(fromstr)):
L[fromstr[i]] = tostr[i]
return ''.join(L)

这会将系统默认的 ASCII 码对应的字符转换成为新的 tostr 中的字符,比如我们传入的字符还是上面所示的“hi python“,而 tostr = 'o javaeye' 也得到了上面的那么一个ASCII码的LIST,这个时候,本来L104对应的字符应该是 “h”,可是我们在这里将其换成了 tostr 中的第一个元素,即 “o”,以此类推荐,所以 maketrans 最后返回的结果将是一个被修改了的 ASCII 字符串,它是将原来 fromstr 中所对应的字符的ASCII码的值更改为 tostr 中的那一个字符。

那么,如果一直按上面所说的,就会得到下面这样的运行结果:

translate('hi python',table)
'o javaeye'

标签: none

评论已关闭