闭包在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中的list列表及其切片和迭代操作
Mar 13 Python
使用Python对Access读写操作
Mar 30 Python
Python用for循环实现九九乘法表
May 31 Python
Python查看微信撤回消息代码
Jun 07 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
python3 enum模块的应用实例详解
Aug 12 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
Python 面向对象之封装、继承、多态操作实例分析
Nov 21 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 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防止恶意刷新与刷票的方法
2014/11/21 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
VueJS全面解析
2016/11/10 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
2016/12/01 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
js实现搜索栏效果
2018/11/16 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
Python显示进度条的方法
2014/09/20 Python
wxPython窗口的继承机制实例分析
2014/09/28 Python
遗传算法之Python实现代码
2017/10/10 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
Django学习之文件上传与下载
2019/10/06 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
实例讲解利用HTML5 Canvas API操作图形旋转的方法
2016/03/22 HTML / CSS
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
应届生求职自荐信范文
2014/04/07 职场文书
国庆宣传标语
2014/06/30 职场文书
校长个人总结
2015/03/03 职场文书
写给老师的保证书
2015/05/09 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
如何获取numpy array前N个最大值
2021/05/14 Python
Java 关于String字符串原理上的问题
2022/04/07 Java/Android