闭包在python中的应用之translate和maketrans用法详解


Posted in Python onAugust 27, 2014

相对来说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程序设计有所帮助。

Python 相关文章推荐
Python通过正则表达式选取callback的方法
Jul 18 Python
python的else子句使用指南
Feb 27 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
Apr 08 Python
Python带动态参数功能的sqlite工具类
May 26 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
python自动化测试之如何解析excel文件
Jun 27 Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 Python
Pytorch模型转onnx模型实例
Jan 15 Python
Python项目实战之使用Django框架实现支付宝付款功能
Feb 23 Python
web.py获取上传文件名的正确方法
Aug 26 #Python
Python version 2.7 required, which was not found in the registry
Aug 26 #Python
web.py中调用文件夹内模板的方法
Aug 26 #Python
web.py在模板中输出美元符号的方法
Aug 26 #Python
Django1.3添加app提示模块不存在的解决方法
Aug 26 #Python
Python引用(import)文件夹下的py文件的方法
Aug 26 #Python
Python中使用item()方法遍历字典的例子
Aug 26 #Python
You might like
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
php实现算术验证码功能
2018/12/05 PHP
PHP 文件上传限制问题
2019/09/01 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
jquery的each方法使用示例分享
2014/03/25 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
python提示No module named images的解决方法
2014/09/29 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
python验证码识别的示例代码
2017/09/21 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
django中related_name的用法说明
2020/05/20 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
详解KMP算法以及python如何实现
2020/09/18 Python
Pycharm中如何关掉python console
2020/10/27 Python
用python对oracle进行简单性能测试
2020/12/05 Python
水果超市创业计划书
2014/01/27 职场文书
读群众路线心得体会
2014/03/07 职场文书
一年级学生期末评语
2014/04/21 职场文书
党员领导干部承诺书
2014/05/28 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
2015年领导干部廉洁自律工作总结
2015/05/26 职场文书
勇敢的心观后感
2015/06/09 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书