《Python Cookbook(第2版)中文版》——1.9 简化字符串的translate方法的使用

简介:

本节书摘来自异步社区《Python Cookbook(第2版)中文版》一书中的第1章,第1.9节,作者[美]Alex Martelli , Anna Martelli Ravenscrof , David Ascher ,高铁军 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.9 简化字符串的translate方法的使用

任务

用字符串的translate方法来进行快速编码,但却发现很难记住这个方法和string.maketrans函数的应用细节,所以需要对它们做个简单的封装,以简化其使用流程。
解决方案

字符串的translate方法非常强大而灵活,具体细节可参考第1.10节。正因为它的威力和灵活性,将它“包装”起来以简化应用就成了个好主意。一个返回闭包的工厂函数可以很好地完成这种任务:

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

讨论

我经常发现我有使用字符串的translate方法的需求,但每次我都得停下来回想它的用法细节(见第1.10节提供的更多细节信息)。所以,我干脆给自己写了个类(后来改写成了本节中展示的工厂闭包的形式),把各种可能性封闭在一个简单易用的接口后面。现在,如果我需要一个函数来选出属于指定集合的字符,我就可以简单地创建并使用它:

>>> 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 Perkins : -'

甚至,我可以用某个字符替换属于某指定集合的字符:

>>> digits_to_hash = translator(from=string.digits, to='#')
>>> digits_to_hash('Chris Perkins : 224-7992')
'Chris Perkins : ###-####'

虽然后面那个应用显得有点特殊,但我仍然不时地碰到有这种需求的任务。

当然,我的设计有点武断,当delete参数和keep参数有重叠部分的时候,我让delete参数优先:

>>> trans = translator(delete='abcd', keep='cdef')
>>> trans('abcdefg')
'ef'

对于你的程序,如果keep被指定了,可能忽略掉delete会更好一些,再或者,如果两者都被指定了,抛出个异常也不错,因为在一个对translator的调用中同时指定两者可能没什么意义。另外,和第1.8节和第1.10节相似,本节代码只适用于普通字符串,对Unicode字符串并不适用。参看第1.10节,可以了解到怎样为Unicode字符串编写类似功能的代码,并可看到Unicode的translate方法与普通(单字节)字符串的translate的区别。

闭包 闭包(closure)不是什么复杂得不得了的东西:它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变量)对于“外层”包含它的函数而言,是本地变量。我们用一个教科书般的例子来说明: def make_adder(addend): def adder(augend): return augend+addend return adder 执行p = make_addr(23)将产生内层函数adder的一个闭包,这个闭包在内部引用了名字addend,而addend又绑定到数值23。q = make_adder(42)又产生另一个闭包,这次名字addend则绑定到了值42。q和p相互之间并无关联,因此它们可以相互独立地和谐共存。现在我们就可以执行它们了,比如,print p(100), q(100)将打印出123 142。 实际上,我们一般认为make_adder指向一个闭包,而不是说什么迂腐拗口的“一个返回闭包的函数”—幸运的是,根据上下文环境,通常这样也不至于造成误解。称make_adder为一个工厂(或者工厂函数)也是简洁明确的;还可以称它为一个闭包工厂来强调它创建并返回闭包,而不是返回类或者类的实例。

相关文章
|
1月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
57 3
|
1月前
|
Python
在 Python 中,如何将日期时间类型转换为字符串?
在 Python 中,如何将日期时间类型转换为字符串?
125 64
|
21天前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
23天前
|
存储 测试技术 Python
Python 中别再用 ‘+‘ 拼接字符串了!
通过选择合适的字符串拼接方法,可以显著提升 Python 代码的效率和可读性。在实际开发中,根据具体需求和场景选择最佳的方法,避免不必要的性能损失。
41 5
|
27天前
|
Python
使用Python计算字符串的SHA-256散列值
使用Python计算字符串的SHA-256散列值
28 7
|
28天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
148 5
|
1月前
|
算法 决策智能 Python
Python中解决TSP的方法
旅行商问题(TSP)是寻找最短路径,使旅行商能访问每个城市一次并返回起点的经典优化问题。本文介绍使用Python的`ortools`库解决TSP的方法,通过定义城市间的距离矩阵,调用库函数计算最优路径,并打印结果。此方法适用于小规模问题,对于大规模或特定需求,需深入了解算法原理及定制策略。
43 15
WK
|
1月前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
93 36
|
1月前
|
Python
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
38 6
|
1月前
|
机器学习/深度学习 人工智能 算法
强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用
本文探讨了强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用,通过案例分析展示了其潜力,并讨论了面临的挑战及未来发展趋势。强化学习正为游戏AI带来新的可能性。
107 4