Python字符串格式化format和百分号%的比较

%和format有什么区别呢?

Python 2.6引入了与现有%运算符略有不同语法的str.format()方法。哪个更好,为什么?
以下使用每种方法并具有相同的结果,所以有什么区别?

#!/usr/bin/python
sub1 = "python string!"
sub2 = "an arg"

a = "i am a %s" % sub1
b = "i am a {0}".format(sub1)

c = "with %(kwarg)s!" % {'kwarg':sub2}
d = "with {kwarg}!".format(kwarg=sub2)

print a    # "i am a python string!"
print b    # "i am a python string!"
print c    # "with an arg!"
print d    # "with an arg!"

此外,什么时候在Python中发生字符串格式化?例如,如果我的日志级别设置为HIGH,我仍然会执行以下%操作的命中?如果是这样,有没有办法避免这种情况?

log.debug("some debug info: %s" % some_info)

处理元组时的区别

回答第一个问题… .format在许多方面功能更加强大。关于%的一个令人讨厌的事情也是如何处理变量和元组作为参数。你会认为一下方法总是正确的:

"hi there %s" % name

但是,实际上呢,如果name恰好是一个元组,例如(1, 2, 3),则会抛出TypeError。为了保证它始终打印正确,你需要这样写代码:

"hi there %s" % (name,)   # supply the single argument as a single-item tuple

这很难看的。 .format没有这些问题。另外在你给出的第二个例子中,.format的例子更清晰。为什么不用它?

什么时候发生格式化

回答第二个问题,什么时候发生字符串格式化呢? Python也并不是那么懒惰的,,它在调用函数之前会对表达式进行计算,所以在log.debug的例子中,表达式"some debug info: %s"%some_info将首先会计算字符串 "some debug info: roflcopters are active",然后该字符串将被传递给log.debug()函数。

By Code问答

发表评论

电子邮件地址不会被公开。 必填项已用*标注

19 − = 12