3.5. 格式化字符串

Python 支持将值格式化为字符串。 虽然这可以包含非常复杂的表达式,但最基本的用法是使用 %s 占位符将值插入字符串。

Note
Python 中的字符串格式化使用与 C 中的 sprintf 函数相同的语法。

示例 3.21. 字符串格式化简介

>>> k = "uid"
>>> v = "sa"
>>> "%s=%s" % (k, v) 1
'uid=sa'
1 整个表达式计算结果为一个字符串。 第一个 %sk 的值替换;第二个 %sv 的值替换。 字符串中的所有其他字符(在本例中为等号)保持不变。

请注意,(k, v) 是一个元组。 我告诉过你它们是有用的。

您可能认为这只是为了进行简单的字符串连接而做了很多工作,您是对的,但字符串格式化不仅仅是连接。 它甚至不仅仅是格式化。 它也是类型强制。

示例 3.22. 字符串格式化与连接

>>> uid = "sa"
>>> pwd = "secret"
>>> print pwd + " is not a good password for " + uid      1
secret is not a good password for sa
>>> print "%s is not a good password for %s" % (pwd, uid) 2
secret is not a good password for sa
>>> userCount = 6
>>> print "Users connected: %d" % (userCount, )           3 4
Users connected: 6
>>> print "Users connected: " + userCount                 5
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
1 + 是字符串连接运算符。
2 在这个简单的例子中,字符串格式化实现了与连接相同的结果。
3 (userCount, ) 是一个包含一个元素的元组。 是的,语法有点奇怪,但这有一个很好的理由:它明确地是一个元组。 实际上,您始终可以在定义列表、元组或字典时在最后一个元素后面包含一个逗号,但在定义只有一个元素的元组时,逗号是必需的。 如果不需要逗号,Python 将不知道 (userCount) 是包含一个元素的元组还是仅仅是 userCount 的值。
4 字符串格式化通过指定 %d 而不是 %s 来处理整数。
5 尝试将字符串与非字符串连接会引发异常。 与字符串格式化不同,字符串连接仅在所有内容都已经是字符串时才有效。

C 中的 printf 一样,Python 中的字符串格式化就像一把瑞士军刀。 有很多选项,还有修饰符字符串可以专门格式化许多不同类型的值。

示例 3.23. 格式化数字

>>> print "Today's stock price: %f" % 50.4625   1
Today's stock price: 50.462500
>>> print "Today's stock price: %.2f" % 50.4625 2
Today's stock price: 50.46
>>> print "Change since yesterday: %+.2f" % 1.5 3
Change since yesterday: +1.50
1 %f 字符串格式化选项将该值视为十进制数,并将其打印到小数点后六位。
2 %f 选项的 ".2" 修饰符将值截断为两位小数。
3 您甚至可以组合修饰符。 添加 + 修饰符会在值之前显示加号或减号。 请注意,".2" 修饰符仍然有效,并且将值填充到正好两位小数。

字符串格式化的进一步阅读