Python 为什么print(“text”str(var1)和“more text”str(var2)被描述为;不赞成;?

Python 为什么print(“text”str(var1)和“more text”str(var2)被描述为;不赞成;?,python,python-2.7,python-3.x,string-formatting,Python,Python 2.7,Python 3.x,String Formatting,为什么下面的代码在Blender的帖子“蛇和咖啡”的评论中被称为“古老的不被认可的印刷方法”?它是否与Python2或Python3的后端代码/实现有关 print("Total score for " + str(name) + " is " + str(score)) 它被认为是旧的,因为通过引入Python3(以及Python2的更高版本),您可以使用“更好”的方式对其进行格式化 print(“+str(name)”的总分+is“+str(score)) 可以写成: print(“%s的

为什么下面的代码在Blender的帖子“蛇和咖啡”的评论中被称为“古老的不被认可的印刷方法”?它是否与Python2或Python3的后端代码/实现有关

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

它被认为是旧的,因为通过引入Python3(以及Python2的更高版本),您可以使用“更好”的方式对其进行格式化

print(“+str(name)”的总分+is“+str(score))

可以写成:
print(“%s的总分为%s”%(姓名、分数))

尽管在Python2及更高版本中有多种不同的打印格式设置方法

上面提到的内容在技术上也很古老,这是在Python2及更高版本中实现这一点的另一种方法


print({}的总分为{})。不允许使用格式(名称、分数)

添加许多字符串,因为:

  • 与其他选择相比,它不是真正可读的
  • 这并不像其他选择那样有效
  • 如果您有其他类型,则必须手动对其调用
    str
而且,是的,它真的很旧。:-)

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

如果您有一个带有占位符的字符串,它不仅可读性更好(它们之间没有
+
str
),而且python还可以计算最终字符串的长度,为最终字符串只分配一个数组,并插入所有内容

实际上,情况并非如此,因为Python会检查字符串是否是中间字符串并进行一些优化。因此,它不像创建不必要的数组那样糟糕

对于小字符串和/或交互式使用,您甚至不会注意到差异。但其他方法的优点是可读性更强

备选方案可以是(前两个是从@MKemps-answer复制的):

  • “{}的总分为{}”。格式(名称、分数)
  • “%s的总分为%s”%(姓名、分数)
    (也是旧的!)
  • “{name}的总分为{score}”。格式(name=name,score=score)
  • f“对于{name}的总分是{score}”
    (非常新-在Python 3.6中引入)

特别是后两个示例表明,您甚至可以在不插入任何内容的情况下读取模板字符串。

在引入新的pep之前,例如引入了新的(更好的,可以说是更好的)字符串格式化方法不被批准?你是说弃用的还是旧的?这里有一些外部文档@cricket_007我用“不赞成”这个词作为我读到它的来源。我想弄清楚的是,它是否真的不被批准以及不被批准的原因。我认为归结到
“value1”+“value2”
的性能不如字符串格式。“年代久远”的意思是在字符串格式化之前就已经存在了。如果要多次键入名称和分数(即变量名),为什么要使用第三种选择?为清晰起见,我将备选方案粘贴在下面。print({name}的总分为{score})。format(name=name,score=score))@heretoinfinity,因为它会在占位符中添加名称和上下文。如果您有一个长字符串和大量输入,您不想“计算”代表占位符的变量。即使不插入任何内容,您也可以“阅读”和“理解”字符串。@heretoinfinity:功能在于可以使用字典。例如:
data={'a':11,'b':12,'c':13};打印({b}比{a}大。格式(**数据))
。还有
打印(“text”,var1,“more text”,var2)