Python打印/格式方法之间的区别

Smu*_*dge 8 python

组合变量和要在Python中打印的字符串时,似乎有很多方法可以做同样的事情;

test = "Hello"
print "{} World".format(test) #Prints 'Hello World'
print test+" World" #Prints 'Hello World'
print "%s World" % test #Prints 'Hello World'
Run Code Online (Sandbox Code Playgroud)

这些方法在性能,兼容性和一般偏好方面的差异(如果有的话).即使在开源项目之间,所有三种方法似乎都可以互换使用.

jon*_*sai 8

如前所述,各种开源项目将使用所有这些方法进行字符串格式化.但是,我会坚持一个项目的方法,以免混淆不同风格的其他开发人员.

print test+" World" 是最有效的,性能最好的,但为您提供最小的灵活性

print "%s World" % test #Prints 'Hello World'基本上就像C sprintf一样进行字符串插值.我喜欢使用这种方法,因为你不仅可以传入常规字符串,还可以传入字典.

print "Good morning %(name), there are %(count)d new articles in %(topic)s today. Would you like to <a href='%(url)s'>read them</a>?" % values

我没有"{} World".format(test)亲自用过.

在实际应用中,这些方法之间的性能差异是微不足道的,它实际上是坚持风格而不是过度编码.


utd*_*mir 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
Run Code Online (Sandbox Code Playgroud)

看起来像b和c是最快的,在d之后,令人惊讶的是a是最慢的.

但是,如果你不进行大量处理,那么使用哪一个并不重要,最好不要将它们混合使用.

我个人更喜欢"".join简单的概念,而str.format用于放置值,比如"Hello, my name is {}.".format(name).

有传言称%Python 3 中的格式化将被弃用并删除,但事实并非如此.

  • 这是非常误导的.您的结论仅适用于少量短字符串,不适用于字符串,较长字符串或更多字符串以外的类型.随着子串的数量和长度的变化,相对速度会发生变化,特别是随着字符串越来越长或越来越多,"b"越来越慢.另外,`b`和`d`要求你连接的任何东西都是字符串,而`a`和`c`则不需要.虽然`a`和`c`大致相似,但`a`是最强大的. (2认同)