视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
闭包在python中的应用之translate和maketrans用法详解
2020-11-27 14:30:56 责编:小采
文档


相对来说python对字符串的处理是比较高效的,方法也有很多。其中maketrans和translate两个方法被应用的很多,本文就针对这两个方法的用法做一总结整理。

首先让我们先回顾下这两个方法:

① s.translate(table,str) 对字符串s移除str包含的字符,剩下的字符串按照table里的字符映射关系替换。table可以理解为转换表,比较'a' -> 'A', 'b'->'B'.

② tabel = string.maketrans('s1', 's2') s1 和 s2 的长度必须一致,maketrans生成一个转换表,若在s中有s1,则替换为s2,这个转换表是字符字符一个个对应的,没必要全部包含。

举几个例子:

import string
s = 'helloworld, 0001111'
table = string.maketrans('','')#没有映射,保留原字符串
s.translate(table) #hello world, 0001111
s.translate(table, 'hello000)'#world, 1111
table = string.maketrans('abcdefgh','ABCDEFGH')
s.translate(table)#HEllo,worlD,0001111
s.translate(table,'world')#HEllo,0001111

我们现在可以将makerans,translate包装起来,形成一个返回闭包的工厂函数(print就是工厂函数),如下所示:

import string
def translator(frm = '', to='', delete= '', keep = None):
 if len(to) == 1:
 to = to * len(frm)
 trans = string.maketrans(frm, to)
 if keep is not None:
 allchars = string.maketrans('','')
 delete = allchars.translate(allchars, keep.translate(allchars, delete))
 def translate(s):
 return s.translate(trans, delete)
 return translate

函数的最后用到了闭包,闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数:

def make_adder(addend):
 def adder(augend): return augend + addend
 return adder

执行 p = make_addr(23)将产生内层函数addr的一个闭包,这个闭包在内部引用了名字addend,而addend又绑定到数值23,执行p(100)则最终返回123。

现在我们已经把各种可能性封闭在一个建议以用的接口后面。

>>>digits_only = translator(keep = string.digits)
>>>digits_only('Chris Perkins :224 -7992')
'2247992'

移除属于某字符集合的元素也非常简单:

>>>no_digits = translator(delete = string.digits)
>>>no_digits('Chris Perkins:224-7992')
'Chris Perkings : - '

也可以替换:

>>>digits_to_hash = translator(from = string.digits, to = '#')
>>>digits_to_hash('Chris Perkins :224-7992')
'Chris Perkins: ###-####'

当delete和keep有重叠部分的时候,delete参数优先

>>>trans = translator(delete = 'abcd', kepp ='cdef')
>>>trans('abcdefg')
'ef'

其实可以更详细的添加一些异常来处理同时出现delete,keep的情况。

希望本文所述对大家的Python程序设计有所帮助。

下载本文
显示全文
专题