Python打印的方式:使用'format'还是百分号形式?

98
在Python中,似乎有两种不同的生成格式化输出的方式:
user = "Alex"
number = 38746
print("%s asked %d questions on stackoverflow.com" % (user, number))
print("{0} asked {1} questions on stackoverflow.com".format(user, number))

是否有一种方法比另一种更受青睐?它们是等效的,有何区别?应该使用哪种形式,特别是对于Python3而言?

4个回答

108

如果你担心 Python 3 和未来的发展,特别是在格式化字符串时,建议使用 format 方法。从文档中可以了解到:

这里描述的格式化操作模仿了 C 语言中的 printf() 语法。它们只支持对某些内置类型进行格式化。由于使用二元操作符,可能需要小心才能正确格式化元组和字典。由于新的 :ref:string-formatting 语法更加灵活且自然地处理元组和字典,因此建议在编写新代码时使用它。但是,目前没有废除 printf 风格格式化的计划。


18
新文档指出百分号运算符:“这里描述的格式化操作展示了各种怪异行为,导致许多常见错误……”但它 没有 被弃用。 http://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting - guettli
3
虽然它还未被正式弃用,但建议您不要使用它。 - BrenBarn
1
相关链接:http://bugs.python.org/issue14123 - guettli
.format 比 % 慢很多吗? - Qi Fan
9
从Python 3.6开始,您可以使用f-strings访问先前定义的变量:print(f"{user}在stackoverflow.com上提出了{number}个问题" - joelostblom

25

.format 函数是在 Python2.6 版本中引入的。

如果您需要向后兼容早期版本的 Python,则应使用 %

对于 Python3 及更高版本,您应该确保使用 .format

.format% 更强大。将 % 迁移到 .format 很容易,但反过来可能会很棘手。


1
它为什么更强大? - yossi
7
@yossi 这里有一个例子:https://dev59.com/i3A75IYBdhLWcg3wkJ31#3228928。它还可以让你进行键/索引查找,如下所示:`import sys;"{[version]}".format(vars(sys))` - John La Rooy
2
怎么样: import sys;"%(version)s" % (vars(sys)) - Pax0r
2
@Pax0r:链接的示例是'{num:{fill}{width}}'.format(num=123, fill='0', width=6)。除非您“双重转义”并将其应用两次,否则无法使用实现此目的。 - John La Rooy
@Sean,那是在格式化字符串而不是数字。如果我只是以某种方式将一个值转换为字符串,根本没有必要添加额外的格式化层。实际上,'%s'%对你已经创建的字符串没有任何额外的添加。 - John La Rooy
显示剩余2条评论

8
您可以使用两种方法。没有人说%格式表达式已经过时。然而,正如之前所述,format方法调用略微更强大。另外请注意,%表达式更加简洁,更易于编码。尝试一下,看看哪种方法适合您最好。

值得注意的是,logging模块使用类似于%的语法,因此出于一致性原因,它可能更受欢迎。 - sshilovsky

8

文档指出,在新的代码中,优先使用format方法。目前没有计划移除%格式化方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接