闭包在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中处理列表之reverse()方法的使用教程
May 21 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
详解Python中heapq模块的用法
Jun 28 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
Python实现简单http服务器
Apr 12 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
Python的Lambda函数用法详解
Sep 03 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
Python实现快速排序的方法详解
Oct 25 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
python异常处理、自定义异常、断言原理与用法分析
Mar 23 Python
python实现mean-shift聚类算法
Jun 10 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实现从远程下载文件的方法
2015/03/12 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
使用Python解析JSON数据的基本方法
2015/10/15 Python
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
python 数据的清理行为实例详解
2017/07/12 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
Django 多环境配置详解
2019/05/14 Python
Python处理PDF与CDF实例
2020/02/26 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
架构师岗位职责
2013/11/18 职场文书
公关关系专员的自我评价分享
2013/11/20 职场文书
七一表彰活动方案
2014/01/18 职场文书
好家长事迹材料
2014/01/23 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
详解Python自动化之文件自动化处理
2021/06/21 Python
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python
python函数的两种嵌套方法使用
2022/04/02 Python
Selenium浏览器自动化如何上传文件
2022/04/06 Python