在Python 3中,使用字符串格式化比字符串拼接更符合Python的风格吗?

4

我正在使用Python 3.4编写一个涉及到频繁使用print()函数向用户显示变量的文本游戏。

通常有两种方法来实现这一目的:使用字符串格式化字符串拼接

print('{} has {} health left.'.format(player, health))

而且,

print(player + ' has ' + str(health) + ' health left.')

那么哪个更好?它们都同样易读和快速输入,并且执行完全相同。哪一个更符合Pythonic的理念,为什么?

这个问题是因为我在 Stack Overflow 上没有找到一个不涉及 Java 的答案而提出的。


1
可以在为什么不使用'+'来连接两个字符串?找到部分答案。 - Wiktor Stribiżew
1
从语义和可读性的角度来看,使用format似乎更好。 - Acepcs
取决于需要连接的字符串数量以及格式的复杂程度。 - RomanPerekhrest
对于一个基于文本的游戏,格式将是基本简单的句子。在同一个 print() 中可能需要打印约 4 或 5 个不同的变量。 - Alice
1
我在SO上找到了另一个与您所寻找的更接近的问题:Python字符串格式化:% vs连接。它也涉及到了.format - Wiktor Stribiżew
显示剩余2条评论
3个回答

8

取决于您的字符串长度和变量数量。对于您的用例,我认为 string.format 更好,因为它具有更好的性能并且阅读起来更加清晰。

有时候,对于较长的字符串,使用 + 更加清晰,因为变量的位置保留在应该在字符串中的位置上,您不需要移动眼睛来映射 {} 的位置到相应的变量。

如果您能够升级到Python 3.6,您可以使用更直观的新字符串格式化语法,如下所示,从而拥有最佳效果:

player = 'Arbiter'
health = 100
print(f'{player} has {health} health left.')

如果您有一个非常大的字符串,我建议使用模板引擎,如Jinja2http://jinja.pocoo.org/docs/dev/)或类似的工具。
参考:https://www.python.org/dev/peps/pep-0498/

这正是我所想的,因为在长代码中将 {} 与相应的变量匹配可能很困难,容易犯错误,并查看该位置的错误变量。看起来你的例子通过提高可读性修复了这个问题。我一定会为此获取 Python 3.6,但我的项目严重依赖于 pygame 模块,你知道 Python 3.6 是否支持 pygame 吗? - Alice
@Arbiter 如果我没记错的话,pygame 在 Python 3.6 上可以正常工作。上次我在运行依赖于 pygameKivy - Eddie
非常好。谢谢你的回答! - Alice
3
@Arbiter,您也可以尝试以下方式:'坐标:{latitude},{longitude}'。格式(latitude='37.24N',longitude='-115.81W'),这种写法在长字符串中非常易读。 - juanpa.arrivillaga
@juanpa.arrivillaga 感谢您提供的额外信息! - Alice

6

format() 更好:

  1. 在性能方面更好。
  2. 更清晰。您可以看到句子的样子以及参数是什么,而不是到处都是 + 和 ' 。
  3. 为您提供更多功能,例如浮点数零后面有多少位,因此更灵活适应变化。

当你说“性能方面更好”时,是指更快和更高效吗?我在考虑使用time模块和time.clock()来查看哪种方法在处理多个变量时最快。 - Alice
连接4个字符串的方法如下:1+2,(1+2)+3,(1+2+3)+4 -> 这样会分配更多的字符串对象并进行更多的字符串操作。这是我非常高层次的解释。但我相信测量结果会证明这一点。 - Hanan

5

这取决于您要组合的对象的数量和类型,以及您想要的输出类型。

>>> d = '20160105'
>>> t = '013640'
>>> d+t
'20160105013640'
>>> '{}{}'.format(d, t)
'20160105013640'
>>> hundreds = 2
>>> fifties = 1
>>> twenties = 1
>>> tens = 1
>>> fives = 1
>>> ones = 1
>>> quarters = 2
>>> dimes = 1
>>> nickels = 1
>>> pennies = 1
>>> 'I have ' + str(hundreds) + ' hundreds, ' + str(fifties) + ' fifties, ' + str(twenties) + ' twenties, ' + str(tens) + ' tens, ' + str(fives) + ' fives, ' + str(ones) + ' ones, ' + str(quarters) + ' quarters, ' + str(dimes) + ' dimes, ' + str(nickels) + ' nickels, and ' + str(pennies) + ' pennies.'
'I have 2 hundreds, 1 fifties, 1 twenties, 1 tens, 1 fives, 1 ones, 2 quarters, 1 dimes, 1 nickels, and 1 pennies.'
>>> 'I have {} hundreds, {} fifties, {} twenties, {} tens, {} fives, {} ones, {} quarters, {} dimes, {} nickels, and {} pennies.'.format(hundreds, fifties, twenties, tens, fives, ones, quarters, dimes, nickels, pennies)
'I have 2 hundreds, 1 fifties, 1 twenties, 1 tens, 1 fives, 1 ones, 2 quarters, 1 dimes, 1 nickels, and 1 pennies.'
>>> f'I have {hundreds} hundreds, {fifties} fifties, {twenties} twenties, {tens} tens, {fives} fives, {ones} ones, {quarters} quarters, {dimes} dimes, {nickels} nickels, and {pennies} pennies.'
'I have 2 hundreds, 1 fifties, 1 twenties, 1 tens, 1 fives, 1 ones, 2 quarters, 1 dimes, 1 nickels, and 1 pennies.'

使用大型格式字符串比进行许多连接要容易得多,并且更不容易出错。此外,格式字符串可以处理实际的格式化,如对齐或舍入,因此您很快就会将连接仅用于最简单的情况,如上所示。


非常出色的例子,我现在可以看到,在涉及多个变量时,字符串格式化比字符串连接更加多才多艺、易于阅读和简单。谢谢! - Alice

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