在 Python 3 中使用字符串格式而不是字符串连接更 Pythonic 吗?

Is it more Pythonic to use String Formatting over String Concatenation in Python 3?

所以我在 Python 3.4 中编写了一个文本游戏,它需要经常使用 print() 函数来向用户显示变量.

我一直这样做的两种方法是 字符串格式 字符串连接 :

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

而且,

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

那么哪个更好呢?它们的可读性和输入速度都一样,并且完全相同。哪个更 Pythonic 为什么?

问题是因为我在 Stack Overflow 上找不到与 Java 无关的答案。

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

有时对于较长的字符串 + 看起来更干净,因为变量的位置保留在它们应该在字符串中的位置,您不必四处移动眼睛来映射 [=13 的位置=]到相应的变量。

如果你能设法升级到 Python 3.6,你可以使用更新的更直观的字符串格式化语法,如下所示,两全其美:

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

如果你有一个非常大的字符串,我建议使用像 Jinja2 (http://jinja.pocoo.org/docs/dev/) 这样的模板引擎或者类似的东西。

参考:https://www.python.org/dev/peps/pep-0498/

format()更好:

  1. 性能更好。
  2. 更清晰。看看句子长什么样子,参数是多少,你周围没有一堆+和'。
  3. 为您提供更多功能,例如浮点数中零后的位数,从而更灵活地进行更改。

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

>>> 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.'

无误地创建大格式字符串比进行大量串联要容易得多。再加上格式字符串可以处理实际的格式设置,如对齐或舍入,您很快就会只在最简单的情况下使用连接,如上所示。