Python print和format方法的区别
在Python中,当你想把一个变量和字符串结合起来打印的时候,有很多种方法可以做到这一点。
test = "Hello"
print "{} World".format(test) #Prints 'Hello World'
print test+" World" #Prints 'Hello World'
print "%s World" % test #Prints 'Hello World'
那么,这些方法在性能、兼容性和一般偏好上有什么不同吗?即使是在开源项目中,这三种方法似乎也可以互换使用。
3 个回答
据我所知,第三个选项已经被第一个选项取代了,具体情况可以在Python的文档中找到。这个选项在Python 3.x及更高版本中已经被移除。第二个选项其实是两个语句合在一起,一个是字符串拼接,另一个是打印这个字符串。
更新:
看起来我的信息有点不准确。从Python 3.0的新特性页面来看:
PEP 3101:高级字符串格式化。注意:2.6版本的描述提到了适用于8位和Unicode字符串的format()方法。在3.0版本中,只有str类型(支持Unicode的文本字符串)支持这个方法;bytes类型不支持。计划是最终让这个方法成为字符串格式化的唯一接口,并在Python 3.1中开始逐步淘汰%运算符。
这里有一个简单的性能测试:
>>> 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 中被淘汰和移除,但实际上并没有。
正如你提到的,很多开源项目会用到这些字符串格式化的方法。不过,我建议在一个项目中坚持使用一种方法,这样可以避免让其他开发者感到困惑,因为风格不一致。
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)
这种方式。
在实际应用中,这些方法之间的性能差别微乎其微,关键在于遵循风格,而不是过度编码。