为什么print(“text”+ str(var1)+“more text”+ str(var2))被描述为“被拒绝”?

时间:2016-12-07 03:31:48

标签: python python-2.7 python-3.x string-formatting

为什么下面的代码在'Snakes and Coffee'的评论中被称为'古老的不赞成方法'到Blender的帖子Print multiple arguments in python?它与Python 2或Python 3的后端代码/实现有关吗?

print("Total score for " + str(name) + " is " + str(score))

2 个答案:

答案 0 :(得分:14)

添加许多字符串不被批准,因为:

  • 与其他选择相比,它的可读性并不高。
  • 它不如替代品那么有效。
  • 如果您有其他类型,则必须手动拨打str

而且,是的,它真的很老了。 : - )

理论上,字符串添加会创建一个新字符串。所以,假设您添加n个字符串,那么您需要创建n-1个字符串,但除了一个之外的所有字符串都会被丢弃,因为您只对最终结果感兴趣。 字符串是作为数组实现的,因此您可以进行大量潜在的昂贵(重新)分配,但没有任何好处。

如果你有一个带占位符的字符串,它不仅更具可读性(你之间没有这些+str),但python也可以计算最终字符串的长度和分配只有一个数组用于最终字符串并插入所有内容。

实际上并不是真正发生的事情,因为Python检查字符串是否是中间件并进行一些优化。所以它没有创建n-2不必要的数组那么糟糕。

对于小字符串和/或交互式使用,您甚至不会注意到差异。但其他方式则具有更易读的优势。

替代品可能是(前两个是从@MKemps回复的):

  • "Total score for {} is {}".format(name, score)
  • "Total score for %s is %s" % (name, score)(也老!)
  • "Total score for {name} is {score}".format(name=name, score=score)
  • f"Total score for {name} is {score}"(非常新 - 在Python 3.6中引入)

特别是后两个例子表明你甚至可以阅读模板字符串而无需插入任何内容。

答案 1 :(得分:3)

它被认为是旧的,因为你可以使用'更好'的方法来引入python 3(及更高版本的python 2)来格式化它。

print("Total score for "+str(name)"+ is "+str(score))

可以写成: print("Total score for %s is %s" % (name, score))

虽然有许多不同的方法可以在python 2及更高版本的更高版本中格式化打印。

以上内容在技术上也是旧的,这是在python 2及更高版本的更高版本中执行此操作的另一种方法。

print('Total score for {} is {}'.format(name, score)