导入模块
# 导入 string 模块
import string
>>> s = 'my name is python'
>>> capwords(s)
'My Name Is Python'
>>> s = 'my-name-is-python'
>>> capwords(s,'-')
'My-Name-Is-Python'
def capwords1(s:str, seq:str=None)->str:
return (seq or ' ').join(map(str.capitalize, s.split(seq)))
from operator import methodcaller
def capwords2(s:str, seq:str=None)->str:
return (seq or ' ').join(map(methodcaller('capitalize'), s.split(seq)))
我们再和标准实现比较性能,我是在 ipython 上测试的:
text = "your time is limted, so don't waste it living someone else's lives" * 10000
%timeit capwords(text)
24.9 ms ± 588 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit capwords1(text)
22.1 ms ± 721 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit capwords2(text)
28.4 ms ± 3.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
substitue 的参数可以是字典:
还可以是关键字参数:
关键字错误,解释器会报 KeyError:
这时候,我们可以使用 template 提供的另外一个方法 safe_subsitute 来防止编译器报错。当 safe_substitute 方法没有找到相应的关键字,会原封不动地返回标识符。
Template 有四个类属性,其中 delimiter 为分隔符,默认为 $
,后面接标识符。通过重写 delimiter,我们可以支持 % 等符号替换。类属性 idpattern 为标识符匹配规则,类属性 flags 表示忽略大小写。
比如说,我们可以重写类属性 delimiter 和 idpattern。
上面我们自定义了一个类,继承自 string.Template,并重写了 delimiter 和 idpattern 类属性。
我们可以看到,分隔符已经换成了百分号,而标识符必须符合 _字母_字母
的形式,否则会提示 valueError。
我们还可以从源码中学到一些技巧:
*args 接受一个字典, kws 接受关键字参数,Chainmap 函数将多个映射连接起来,就可以查找 args 和 kws 中的关键字。
以上就是我学习 Python 标准库的思考,还请大家多多转发支持。