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

时间:2017-01-05 09:25:12

标签: python string string-formatting string-concatenation

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

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

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

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

哪个更好?它们同样具有可读性和快速键入性能,并且完全相同。哪一个更强 Pythonic 以及为什么?

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

3 个答案:

答案 0 :(得分:4)

取决于你的字符串有多长以及有多少变量。对于您的用例,我相信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/

答案 1 :(得分:4)

format()更好:

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

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

在没有错误的情况下创建大型格式字符串比进行大量连接要容易得多。添加格式字符串可以处理实际格式化的事实,例如对齐或舍入,并且您很快就会在最简单的情况下保留连接,如上所示。