3.5. 格式化字符串
Description: Python from novice to pro
Keywords: Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free

# 深入 Python :Dive Into Python 中文版 Python 从新手到专家 [Dip_5.4b_CPyUG_Release] | Find:

## 3.5. 格式化字符串

Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式，但最基本的用法是将一个值插入到一个有字符串格式符 `%s` 的字符串中。

在 Python 中，字符串格式化使用与 C 中 `sprintf` 函数一样的语法。

### 例 3.21. 字符串的格式化

    >>> k = "uid"
    >>> v = "sa"
    >>> "%s=%s" % (k, v)
    'uid=sa'

| 整个表达式的值为一个字符串。第一个 `%s` 被变量 `k` 的值替换；第二个 `%s` 被 `v` 的值替换。字符串中的所有其它字符 (在这个例子中，是等号) 按原样打印输出。

注意 `(k, v)` 是一个 tuple。我说过它们对某些东西有用。

您可能一直在想，做了这么多工作只不过是为了做简单的字符串连接。您想的不错，只不过字符串格式化不只是连接。它甚至不仅仅是格式化。它也是强制类型转换。

### 例 3.22. 字符串格式化与字符串连接的比较

    >>> uid = "sa"
    >>> pwd = "secret"
    >>> print pwd + " is not a good password for " + uid
    secret is not a good password for sa
    >>> print "%s is not a good password for %s" % (pwd, uid)
    secret is not a good password for sa
    >>> userCount = 6
    >>> print "Users connected: %d" % (userCount, )
    Users connected: 6
    >>> print "Users connected: " + userCount
    Traceback (innermost last):
      File "<interactive input>", line 1, in ?
    TypeError: cannot concatenate 'str' and 'int' objects

| `+` 是字符串连接操作符。
| 在这个简单例子中，字符串格式化实现与连接一样的结果。
| `(userCount, )` 是一个只包含一个元素的 tuple。是的，语法有一点奇怪，但是使用它的理由就是：显示地指出它是一个 tuple，而不是其他。实际上，当定义一个 list、tuple 或 dictionary 时，您可以总是在最后一个元素后面跟上一个逗号，但是当定义一个只包含一个元素的 tuple 时逗号是必须的。如果省略逗号，Python 不会知道 `(userCount)` 究竟是一个只包含一个元素的 tuple 还是变量 `userCount` 的值。
| 字符串格式化通过将 `%s` 替换成 `%d` 即可处理整数。
| 试图将一个字符串同一个非字符串连接会引发一个异常。与字符串格式化不同，字符串连接只能在被连接的每一个都是字符串时起作用。

如同 `printf` 在 C 中的作用，Python 中的字符串格式化是一把瑞士军刀。它有丰富的选项，不同的格式化格式符和可选的修正符可用于不同的数据类型。

### 例 3.23. 数值的格式化

    >>> print "Today's stock price: %f" % 50.4625
    50.462500
    >>> print "Today's stock price: %.2f" % 50.4625
    50.46
    >>> print "Change since yesterday: %+.2f" % 1.5
    +1.50

| `%f` 格式符选项对应一个十进制浮点数，不指定精度时打印 6 位小数。
| 使用包含“.2”精度修正符的 `%f` 格式符选项将只打印 2 位小数。
| 您甚至可以混合使用各种修正符。添加 `+` 修正符用于在数值之前显示一个正号或负号。注意“.2”精度修正符仍旧在它原来的位置，用于只打印 2 位小数。

### 进一步阅读

- Python Library Reference 总结了所有字符串格式化所使用的格式符。
- Effective AWK Programming 讨论了所有的格式符和高级字符串格式化技术，如指定宽度，精度和0填充。