Python print和format方法的区别

9 投票
3 回答
5009 浏览
提问于 2025-04-16 22:59

在Python中,当你想把一个变量和字符串结合起来打印的时候,有很多种方法可以做到这一点。

test = "Hello"
print "{} World".format(test) #Prints 'Hello World'
print test+" World" #Prints 'Hello World'
print "%s World" % test #Prints 'Hello World'

那么,这些方法在性能、兼容性和一般偏好上有什么不同吗?即使是在开源项目中,这三种方法似乎也可以互换使用。

3 个回答

1

据我所知,第三个选项已经被第一个选项取代了,具体情况可以在Python的文档中找到。这个选项在Python 3.x及更高版本中已经被移除。第二个选项其实是两个语句合在一起,一个是字符串拼接,另一个是打印这个字符串。

更新:

看起来我的信息有点不准确。从Python 3.0的新特性页面来看:

PEP 3101:高级字符串格式化。注意:2.6版本的描述提到了适用于8位和Unicode字符串的format()方法。在3.0版本中,只有str类型(支持Unicode的文本字符串)支持这个方法;bytes类型不支持。计划是最终让这个方法成为字符串格式化的唯一接口,并在Python 3.1中开始逐步淘汰%运算符。

8

这里有一个简单的性能测试:

>>> a = lambda: "{} World".format("Hello")
>>> b = lambda: "Hello" + " World"
>>> c = lambda: "%s World" % "Hello"
>>> d = lambda: "".join(("Hello", " World"))
>>> a(), b(), c(), d()
('Hello World', 'Hello World', 'Hello World', 'Hello World')
>>> timeit.timeit(a)
0.7830071449279785
>>> timeit.timeit(b)
0.18782711029052734
>>> timeit.timeit(c)
0.18806695938110352
>>> timeit.timeit(d)
0.3966488838195801

看起来 b 和 c 是最快的,接下来是 d,令人惊讶的是 a 是最慢的。

不过,如果你不进行很多处理,其实用哪个都没关系,只要尽量不要混用它们。

我个人比较喜欢用 "".join 来做简单的字符串连接,而用 str.format 来放置值,比如 "Hello, my name is {}.".format(name)

曾经有传言说 % 格式化会在 Python 3 中被淘汰和移除,但实际上并没有。

9

正如你提到的,很多开源项目会用到这些字符串格式化的方法。不过,我建议在一个项目中坚持使用一种方法,这样可以避免让其他开发者感到困惑,因为风格不一致。

print test+" World" 是效率最高的方式,但灵活性最差。

print "%s World" % test #打印 'Hello World' 基本上就像C语言里的 sprintf,它可以把字符串插入到特定位置。我很喜欢用这种方法,因为你不仅可以传入普通字符串,还可以传入字典。

print "早上好 %(name),今天有 %(count)d 篇新文章在 %(topic)s。你想要 <a href='%(url)s'>阅读它们</a>吗?" % values

我个人没有用过 "{} World".format(test) 这种方式。

在实际应用中,这些方法之间的性能差别微乎其微,关键在于遵循风格,而不是过度编码。

撰写回答