闭包在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实现程序的单一实例用法分析
Jun 03 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
使用python存储网页上的图片实例
May 22 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
Python猜数字算法题详解
Mar 01 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
浅谈Python 命令行参数argparse写入图片路径操作
Jul 12 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
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模板引擎smarty详细介绍
2015/05/26 PHP
PHP目录操作实例总结
2016/09/27 PHP
PHP文件操作详解
2016/12/30 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
Javascript学习笔记 delete运算符
2011/09/13 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
layui table 参数设置方法
2018/08/14 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
python调用百度语音识别api
2018/08/30 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
python创建学生成绩管理系统
2019/11/22 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
大二自我鉴定范文
2013/10/05 职场文书
书法培训心得体会
2014/01/05 职场文书
五年级英语教学反思
2014/01/31 职场文书
新品发布会策划方案
2014/06/08 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书