闭包在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之网站的结构
Oct 24 Python
Python中__name__的使用实例
Apr 14 Python
Python获取文件所在目录和文件名的方法
Jan 12 Python
windows下Python实现将pdf文件转化为png格式图片的方法
Jul 21 Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
python通过zabbix api获取主机
Sep 17 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
Python代码太长换行的实现
Jul 05 Python
用Cython加速Python到“起飞”(推荐)
Aug 01 Python
使用Pycharm分段执行代码
Apr 15 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
python中time tzset()函数实例用法
Feb 18 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动态图像的创建
2006/10/09 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python中正则表达式的详细教程
2015/04/30 Python
详解python之简单主机批量管理工具
2017/01/27 Python
python实现八大排序算法(1)
2017/09/14 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
生产部经理岗位职责
2013/12/16 职场文书
策划创业计划书
2014/02/06 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
学习保证书范文
2014/04/30 职场文书
学生党员公开承诺书
2014/05/28 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书