闭包在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 urls.py的三种配置写法实例详解
Apr 28 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
python 2.7.14安装图文教程
Apr 08 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
Opencv+Python 色彩通道拆分及合并的示例
Dec 08 Python
对Python定时任务的启动和停止方法详解
Feb 19 Python
关于python多重赋值的小问题
Apr 17 Python
PyTorch之图像和Tensor填充的实例
Aug 18 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
python微信公众号开发简单流程实现
Mar 09 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 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获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
基于javascript实现样式清新图片轮播特效
2016/03/30 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
Python生成器(Generator)详解
2015/04/13 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
使用Django搭建网站实现商品分页功能
2020/05/22 Python
python unichr函数知识点总结
2020/12/16 Python
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
中软Java笔试题
2012/11/11 面试题
几道数据库的概念性面试题
2014/05/30 面试题
物流仓储计划书
2014/01/10 职场文书
装修设计师求职信
2014/02/26 职场文书
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js
关于Vue中的options选项
2022/03/22 Vue.js
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers