闭包在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 open()文件处理使用介绍
Nov 30 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
python实现文本界面网络聊天室
Dec 12 Python
python绘制地震散点图
Jun 18 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
Python程序慢的重要原因
Sep 04 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 Python
python 实现mysql自动增删分区的方法
Apr 01 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 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按行读取文件时删除换行符的3种方法
2014/05/04 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
详解Python编程中基本的数学计算使用
2016/02/04 Python
Python md5与sha1加密算法用法分析
2017/07/14 Python
理解python中生成器用法
2017/12/20 Python
python实现自动发送邮件
2018/06/20 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
python实现网页录音效果
2020/10/26 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
小区推广策划方案
2014/06/06 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers