6.4 只适用于字符串的操作符
6.4.1 格式化操作符(%)
Python风格的字符串格式化操作符。只适用于字符串类型,非常类似于C语言里面的printf()函数的字符串格式化,甚至所用的符号都一样,都用百分号(%),并且支持所有printf()式的格式化操作。语法如下。
左边的format_string里面同通常会在printf()函数的第一个参数里面见到的一样,包含%的格式化字符串。表6.4列出了可用的各种符号。arguments_to_convert参数是你要转化、显示的变量,对应于你送给prinf()的其他参数。
Python支持两种格式的输入参数。第一种是元组(见2.8节,6.15节),这基本上是一种的C printf()风格的转换参数集;Python支持的第二种形式是字典形式(详见第七章)字典其实是一个哈希键-值对的集合。这种形式里面,键是作为格式字符串出现,相对应的值作为参数在进行转化时提供给格式字符串.格式字符串既可以跟print语句一起用来向终端用户输出数据,又可以用来合并字符串形成新字符串,而且还可以直接显示到GUI界面上去。其他的格式字符和方法见表6.5。
以下是一些使用格式字符串的例子。
1. 十六进制输出
2. 浮点型和科学记数法形式输出
3. 整型和字符串输出
上面的例子都是使用的元组类型的参数作转换。下面我们将把字典类型的参数提供给格式化操作符。
4. 令人称奇的调试工具
字符串格式化操作符不仅很酷、易用、上手快,而且是一个非常有用的调试工具。事实上,所有的Python对象都有一个字符串表示形式(通过repr()函数,或tr()函数来展现)。print语句自动为每个对象调用str()函数。更好的是,在定义自己的对象时,你可以利用“钩子”为你的对象创建字符串表达形式。这样,repr(),str()或者print被调用时,就可以获得一个适当的字符串描述信息。即使在坏得不能再坏的情况下,repr()或者str()也不能显示一个对象的信息时,“Pythonic”的默认做法最起码能给你返回如下格式的信息。
6.4.2 字符串模板:更简单的替代品
字符串格式化操作符是Python里面处理这类问题的主要手段,而且以后也是如此。然而它也不是完美的,其中的一个缺点是它不是那么直观,尤其对刚从C/C++转过来的Python新手来说更是如此,即使是现在使用字典形式转换的程序员也会偶尔出现遗漏转换类型符号的错误。比如说,用了%(lang)而不是正确的%(lang)s。为了保证字符串被正确的转换,程序员必须明确的记住转换类型参数,比如到底是要转成字符串、整型还是其他什么类型。
新式的字符串模板的优势是不用去记住所有的相关细节的,而是像现在shell风格的脚本语言里面那样使用美元符号($)。
由于新式的字符串Template对象的引进使得string模块又重新活了过来,Template对象有两个方法, substitute()和safe_substitute()。前者更为严谨,在key缺少的情况下它会报一个KeyError的异常出来,而后者在缺少key时,直接原封不动的把字符串显示出来。
新式的字符串模板是从Python2.4开始加入的,更多信息请查阅《Python类库参考手册》(Python Library Reference Manual)和PEP 292。
6.4.3 原始字符串操作符(r/R)
关于原始字符串的目的,在Pythonl.5里面已经有说明,是为了对付那些在字符串中出现的特殊字符(下面的小节会介绍这些特殊字符)。在原始字符串里,所有的字符都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。
原始字符串的这个特性让一些工作变得非常的方便,比如正则表达式的创建(详见文档的re模块)。正则表达式是一些定义了高级搜索匹配方式的字符串,通常是由代表字符、分组、匹配信息、变量名和字符类等的特殊符号组成。正则表达式模块已经包含了足够用的符号。但当你必须插入额外的符号来使特殊字符表现的像普通字符的时候,你就陷入了“字符数字”的泥潭!这时原始字符串就会派上用场了。
除了原始字符串符号(引号前面的字母“r”)以外,原始字符串跟普通字符串有着几乎完全相同的语法。这个‘r’可以是小写也可以是大写,唯一的要求是必须紧靠在第一个引号前。在3个例子的第1个例子里面,我们需要一个反斜杠加一个“n”来而不是一个换行符。
接下来的例子里,我们打不开我们的README文件了,为什么?因为‘\t’和‘\r’被当成不在我们的文件名中的特殊符号,但它们实际上是文件路径中的4个独立的字符。
最后我们要找一对原始的\n字符而不是换行。为了找到它,我们使用了一个简单的正则表达式,它的作用是查找通常被用来表示空白字符的反斜线-字符对(backslash-character pairs)。
6.4.4 Unicode字符串操作符(u/U)
Unocide字符串操作符,大写的(U)和小写的(u)是在Pythonl.6中和Unicode字符串一起被引入的,它用来把标准字符串或者是包含Unicode字符的字符串转换成完全的Unicode字符串对象。关于Unicode字符串的进一步信息在6.7.4节有详细介绍。另外,字符串方法(见6.6节)和正则表达式引擎也支持Unicode。下面是几个例子。
Unicode操作符也可以接受原始Unicode字符串,只要我们将Unicode操作符和前面讨论过的原始字符串操作符连接在一起就可以了。注意,Unicode操作符必须出现在原始字符串操作符前面。