【问题标题】:Why is print("text" + str(var1) + "more text" + str(var2)) described as "disapproved"?为什么 print("text" + str(var1) + "more text" + str(var2)) 被描述为“未获批准”?
【发布时间】:2017-04-21 21:26:47
【问题描述】:

为什么在“Snakes and Coffee”对 Blender 的 Print multiple arguments in python 帖子的评论中,下面的代码被称为“古老的不被批准的打印方法”?是否与 Python 2 或 Python 3 的后端代码/实现有关?

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

【问题讨论】:

  • 在引入新的 pep 之前,例如 python.org/dev/peps/pep-3101 引入了新的(更好的,可以说是)字符串格式化方式
  • 未获批准?您的意思是已弃用或旧的?
  • 这里有一些外部文档。 pyformat.info
  • @cricket_007 我使用“不赞成”这个词作为我提到的阅读来源。是否真的不被批准,如果是,原因是我想弄清楚的。
  • 我认为这归结为"value1" + "value2" 的性能不如字符串格式。在字符串格式存在之前的“古老”含义。

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


【解决方案1】:

不赞成添加许多字符串,因为:

  • 与其他替代品相比,它的可读性并不高。
  • 它不如其他方法有效。
  • 如果您有其他类型,您必须手动调用它们的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 中引入)

尤其是后两个例子表明,您甚至可以读取模板字符串而无需插入任何内容。

【讨论】:

  • 如果您将多次输入名称和分数(即变量名称),为什么还要使用第三种选择?为清楚起见,我在下面粘贴了替代方案。 print ("{name} 的总分是 {score}".format(name=name, score=score))
  • @heretoinfinity 因为它为占位符添加了名称和上下文。如果您有一个长字符串和大量输入,您不想“计算”代表该占位符的变量。即使不插入任何内容,您也可以“阅读”和“理解”字符串。
  • @heretoinfinity:能力在于使用字典的可能性。示例:data = {'a': 11, 'b': 12, 'c': 13}; print('{b} is bigger than {a}'.format(**data)).
  • 还有print("text", var1, "more text", var2)
【解决方案2】:

它被认为是旧的,因为您可以通过引入 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多