<< >>

diveintopython.org |

Python for experienced programmers

## 1.11. 格式化字符串

`odbchelper.py` 所有实际的工作是用一行代码完成的，下面就是。

        return ";".join(["%s=%s" % (k, params[k]) for k in params.keys()])

不要恐慌。忽略别的东西，集中在中间部分，它是字符串格式化表达式。(如果你是一个C高手，也许可以忽略这部分。)

例 1.25. 中间部分

    "%s=%s" % (k, params[k])

Python支持将值的格式化输出到字符串中，象C语言中的 `sprintf` 函数。最基本的用法是简单地在 `%s` 占位符的地方插入一个值。

例 1.26. 字符串格式化介绍

    >>> params = {"uid":"sa", "pwd":"secret"}
    >>> k = "uid"
    >>> "%s=%s" % (k, params[k])
    'uid=sa'
    >>> k = "pwd"
    >>> "%s=%s" % (k, params[k])
    'pwd=secret'

| 整个表达式计算结果为一个字符串。(原文：“The whole expression evaluates to a string.”估且如此翻译。) 第一个 `%s` 被变量 `k` 的值替换；第二个 `%s` 被字典 `params` 中的键字为 `k` 的值替换。在字符串中所有其它的字符(在这个例子中，是等号)按原样保留。
| 这个表达式可用在字典中的任一关键字。(“哈，那意味着它可用于字典中 每个 关键字...在一个循环中..”不要太超前，马上就来了。)

注意`(k，params[k])`是一个序列。我说过它们对某些东西有用。

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

例 1.27. 字符串格式化对比字符串连接

    >>> 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 add type "int" to string

| `+` 是字符串连接操作符。
| 在这个简单例子中，字符串格式化实现与连接一样的结果。
| `(userCount, )`是一个有一个元素的序列。是的，语法有一点奇怪，但是对此有更好的理由。
| 字符串格式化通过将 `%s` 替换成 `%d` 即可处理整数。还记得我说过你需要知道Python会什么时候和会如何将数据强制转换成不同的类型吗？这就是其中一例。
| 试图将一个字符串同一个非字符串连接会引发一个异常。字符串连接只能在每个都是字符串时起作用。

进一步阅读 |

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

« 定义变量 | 映射列表 »