Python从C语言中借鉴了一些语法特性,其中包括C语言中的printf式的格式化字符串。这种格式化字符串的方式很容易理解,下面是一个简单的示例:
- >>> word = 'world'
- >>> 'Hello,%s!' % word # 第二个百分号前后的空格不是必须的
- 'Hello,world!'
其中,%s是格式说明符。它一方面告诉Python解释器该在哪里取代word的值(即占位);另一方面告诉Python解释器该字符串要格式化成什么样的形式。
注意:%s,s代表string;%不是取模运算符,而是格式化字符串运算符。在前文中出现过类似情况,例如,数字间的“+”运算符用于数字加法运算,而在序列中“+”运算符用于序列拼接。这种同一种运算符的行为随着数据类型的不同而发生行为的改变,称为运算符重载(operator overloading)。
当多个字符串需要被格式化时,就需要将它们放到元组中:
- >>> word1 = 'Hello'
- >>> word2 = 'world'
- >>> '%s, %s!' % (word1, word2)
- 'Hello, world!'
除了%s外,格式说明符号还有很多种。常用的格式说明符及其含义如表所示。
使用%s格式化说明符应该提供一个字符串:
- >>> name = '小明'
- >>> notice = '%s,很遗憾您这次没有及格!'
- >>> notice % name
- '小明,很遗憾您这次没有及格!'
使用%d格式说明符应该提供一个数字:
- >>> name = '小明'
- >>> score = 59
- >>> notice1 = '%s,很遗憾,您的分数是%d,没有及格!'
- >>> notice1 % (name, score)
- '小明,很遗憾,您的分数是59,没有及格!
使用%d格式说明符时,如果提供的是浮点数,那么将舍弃小数部分,而转换成整数:
- >>> name = '小明'
- >>> score = 59.9
- >>> notice1 = '%s,很遗憾,您的分数是%d,没有及格!'
- >>> notice1 % (name, score)
- '小明,很遗憾,您的分数是59,没有及格!'
使用%f格式说明符时,默认为6位小数:
- >>> name = '小明'
- >>> score = 59.9
- >>> notice2 = '%s,很遗憾,您的分数是%f,没有及格!'
- >>> notice2 % (name, score)
- '小明,很遗憾,您的分数是59.900000,没有及格!'
使用%f格式说明符时,可以指定小数位数:
- >>> name = '小明'
- >>> score = 59.9
- >>> notice3 = '%s,很遗憾,您的分数是%.2f,没有及格!'
- >>> notice3 % (name, score)
- '小明,很遗憾,您的分数是59.90,没有及格!'
使用%x格式说明符时,将十进制数转换成十六进制数:
- >>> name = '小明'
- >>> score = 59
- >>> notice4 = '%s,很遗憾,您的分数用十六进制表示为%x,没有及格!'
- >>> notice4 % (name, score)
- '小明,很遗憾,您的分数用十六进制表示为3b,没有及格!'
对于这种“老式”的printf式的格式化字符串就讨论到这里,它已经逐渐“过时”。