Python食谱-1.19.判断字符串是否以多个字符串中的一个结尾
| 原文作者: | Michele Simionato |
|---|---|
| 中文翻译: | Tony (digitalsatori) |
问题
对于一个指定的字符串s,如何判断其是否以多个字符串中的任意一个结尾;或者说,有没有一个等效但更简洁明了的方法来表示 s.endwith(end1) or s.endwith(end2) or s.endwith(end3) ...
解决方法
itertools.imap 函数是解决此类问题简洁有效的方法:
import itertools
def anyTrue(predicate, sequence):
return True in itertools.imap(predicate, sequence)
def endsWith(s, *endings):
return anyTrue(s.endswith, endings)
讨论
endsWith 的一个典型应用就是输出当前目录下的所有图片文件的名称:
import os
for filename in os.listdir('.'):
if endsWith(filename, '.jpg', '.jpeg', '.gif'):
print filename
本配方的解决方案中的通用处理方法同样适用与其它对字符串的检测判断。辅助函数 anyTrue 很通用,运行速度也快,我们可以传递任何'绑定方法‘(bound methods)给其第一个参数(predicate),比如: s.startwith` 或者 ``s.__contains__ 等等。实际上根本不使用 endsWith 辅助函数可能更好:
if anyTrue(filename.endswith, (".jpg", ".gif", ".png")):
这样的编码也已经足够清晰了。
绑定方法(Bound Method)
当某个Python对象拥有一个方法,我们可以直接访问这个对象的方法,获得的是这个对象的绑定方法。(比如你可以将它赋值给变量,可以将它作为函数的返回值,等等)。例如:
L = ['fee', 'fie', 'foo'] x = L.append
以上编码中变量名 x 指向列表对象 L 的绑定方法。以 x('fum') 调用方法,与 L.append('fum') 这种形式完全等价。调用的结果都会修改对象 L 为 ['fee', 'fie', 'foo', 'fum'] 。
如果访问的是type或class上的方法(而非其实例上的方法),那么我们获得的就是非绑定方法(unbound method),该方法不与任何一个type或class的实例关联。当调用它时,我们需要将这个type或class的一个实例作为其第一个参数传递给它。例如, 设 y = list.append ,我们不能直接调用 y('I') ,Python无法猜测你要将'I'扩展到哪个列表上!我们可以使用 y(L,'I') ,这与调用 L.append('I') 完全等价,前提是 isinstance(L, list) ,即L是一个列表对象。
该配方来源于 news:comp.lang.python 上的讨论,Raymond Hettinger, Chris Perkins, Bengt Richter和其它一些人都为概念的澄清提供了帮助。
参见
Python库参考手册以及python in a Nutshell中关于 itertools和字符串的方法的介绍。













