闭包在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代码真的很爽
Aug 26 Python
使用Python的Flask框架实现视频的流媒体传输
Mar 31 Python
python写入xml文件的方法
May 08 Python
Python文件去除注释的方法
May 25 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
Python识别html主要文本框过程解析
Feb 18 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
opencv 图像加法与图像融合的实现代码
Jul 08 Python
python接入支付宝的实例操作
Jul 20 Python
Python 数据的累加与统计的示例代码
Aug 03 Python
python Paramiko使用示例
Sep 21 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
PHP模板引擎SMARTY
2006/10/09 PHP
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
2014/05/23 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
angular2使用简单介绍
2016/03/01 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
js实现微博发布小功能
2017/01/12 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python之import机制详解
2014/07/03 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Django实现学员管理系统
2019/02/26 Python
详解django2中关于时间处理策略
2019/03/06 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
python实现静态web服务器
2019/09/03 Python
python匿名函数的使用方法解析
2019/10/10 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
python不同版本的_new_不同点总结
2020/12/09 Python
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
统计学教授推荐信
2014/09/18 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
检讨书大全
2015/01/27 职场文书
2015年教师节慰问信
2015/03/23 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
新店开张宣传语
2015/07/13 职场文书