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]) 1
'uid=sa'
>>> k = "pwd"
>>> "%s=%s" % (k, params[k]) 2
'pwd=secret'
1

整个表达式计算结果为一个字符串。(原文:“The whole expression evaluates to a string.”估且如此翻译。) 第一个 %s 被变量 k 的值替换;第二个 %s 被字典 params 中的键字为 k 的值替换。在字符串中所有其它的字符(在这个例子中,是等号)按原样保留。

2 这个表达式可用在字典中的任一关键字。(“哈,那意味着它可用于字典中 每个 关键字...在一个循环中..”不要太超前,马上就来了。)

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

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

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

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

进一步阅读