【问题标题】:Are there other ways to format strings other then comma, percent, plus sign?除了逗号、百分号和加号之外,还有其他方法可以格式化字符串吗?
【发布时间】:2014-04-22 08:40:37
【问题描述】:

我一直在环顾四周,但无法找到这个问题的明确答案:在 Python 中打印变量的推荐方法是什么?

到目前为止,我已经看到了三种方法:使用逗号、使用百分号或使用加号:

>>> a = "hello"
>>> b = "world"
>>> print a, "to the", b
hello to the world
>>> print "%s to the %s" % (a, b)
hello to the world
>>> print a + " to the " + b
hello to the world

每种方法似乎都有其优点和缺点。

逗号允许直接写入变量并添加空格,以及在需要时自动执行字符串转换。但我似乎记得,良好的编码实践表明最好将变量与文本分开。

百分号允许这样做,尽管它们需要在有多个变量时使用列表,并且您必须编写变量的类型(尽管即使变量类型不同,它似乎也可以转换,比如尝试用 %s 打印一个数字)。

加号似乎是“最糟糕的”,因为它们混合了变量和文本,并且不会即时转换;虽然可能有必要不时对您的变量进行更多控制。

我环顾四周,似乎其中一些方法现在可能已经过时了。由于它们似乎都有效并且各有利弊,我想知道:是否有推荐的方法,或者它们都取决于上下文?

【问题讨论】:

  • .format 更好。这个问题“主要基于意见”,以及我的评论
  • 这个问题可能值得标记python2.7
  • 你可以看看这个链接:- ebeab.com/2012/10/10/python-string-format
  • 投了反对票,因为您显然没有在 Google 上搜索 python format string,这会导致您使用 format 方法。另见docs.python.org/2/library/string.html#formatspec
  • @l4mpi 我承认“格式”不是在谈论这个时想到的一个词,但它应该有。很抱歉,感谢您的回答。

标签: python variables concatenation string-formatting


【解决方案1】:

在字符串中包含来自标识符的值称为字符串格式化。您可以用不同的方式处理字符串格式,各有利弊。

  • 使用字符串连接 (+)
    • 缺点:您必须手动将对象转换为字符串
    • 专业版:对象出现在您要放入字符串的位置
    • Con:由于破坏了字符串文字,最终布局可能不清晰
  • 使用template strings(即$bash-style替换):
    • 亲:你可能熟悉 shell 变量扩展
    • 专业版:自动转换为字符串
    • 专业版:最终布局清晰。
    • 缺点:您无法指定如何执行转换
  • 使用% 样式格式:
    • Pro:类似于使用 C 的 printf 格式化。
    • 专业版:为您完成转换
    • 专业版:您可以通过一些选项指定不同类型的转换(例如 floats 的精度)
    • 专业版:最终布局清晰
    • 专业版:您还可以指定要替换的元素的名称,如:%(name)s
    • 缺点:您无法自定义格式说明符的处理方式。
    • 骗局:有些极端情况会让你感到困惑。为了避免它们,您应该始终使用tupledict 作为参数。
  • 使用str.format
    • % 样式格式的所有优点(除了它与printf 不相似)
    • 类似于.NET String.Format
    • 专业版:您可以手动指定编号字段,从而允许您多次使用位置参数
    • 专业版:格式说明符中的更多选项
    • 专业版:您可以自定义自定义类型中的格式说明符

逗号进行字符串格式化。它们是print statement 语句语法的一部分。 他们有一个软空间“功能”,这在 python3 中已经消失了,因为print 现在是一个函数:

>>> print 'something\t', 'other'
something       other
>>> print 'something\tother'
something       other

请注意,即使第一个输出使用逗号,上述输出如何完全相同。 这是因为逗号在某些情况下不会引入空格(例如,紧跟在制表符或换行符之后)。

在 python3 中这不会发生:

>>> print('something\t', 'other')
something        other
>>> print('something\tother')  # note the difference in spacing.
something       other

从 python2.6 开始,进行字符串格式化的首选方法是使用str.format 方法。它旨在替换 % 样式的格式,尽管目前没有计划(而且我永远不会有)删除 % 样式的格式。

【讨论】:

    【解决方案2】:

    string.format() 基础知识

    这里有几个基本字符串替换的例子,{} 是替换变量的占位符。如果没有指定格式,它将插入并格式化为字符串。

    s1 = "so much depends upon {}".format("a red wheel barrow")
    s2 = "glazed with {} water beside the {} chickens".format("rain", "white")
    

    您还可以使用变量的数字位置并在字符串中更改它们,这在格式化时提供了一些灵活性,如果您在顺序上犯了错误,您可以轻松更正,而无需将所有变量打乱。

    s1 = " {0} is better than {1} ".format("emacs", "vim")
    s2 = " {1} is better than {0} ".format("emacs", "vim")
    

    format() 函数提供了相当多的附加特性和功能,这里有一些使用 .format() 的有用提示和技巧

    命名参数

    您可以将新的字符串格式用作模板引擎并使用命名参数,而不需要严格的顺序。

    madlib = " I {verb} the {object} off the {place} ".format(verb="took", object="cheese", place="table")
    >>> I took the cheese off the table
    

    多次重复使用同一个变量

    使用 % 格式化程序,需要对变量进行严格的排序,.format() 方法允许您按照我们在上面基础知识中看到的任何顺序放置它们,但也允许重用。

    str = "Oh {0}, {0}! wherefore art thou {0}?".format("Romeo")
    >>> Oh Romeo, Romeo! wherefore art thou Romeo?
    

    将格式用作函数

    您可以将 .format 用作一个函数,该函数允许将文本和格式从代码中分离出来。例如,在您的程序开始时,您可以包含所有格式,然后再使用。这也是处理国际化的好方法,它不仅需要不同的文本,而且通常需要不同的数字格式。

    email_f = "Your email address was {email}".format
    print(email_f(email="bob@example.com"))
    

    转义大括号

    如果在使用 str.format() 时需要使用大括号,只需加倍

    print(" The {} set is often represented as {{0}} ".format("empty"))
    >>> The empty set is often represented as {0}
    

    【讨论】:

      【解决方案3】:

      问题是,您是想要打印变量(案例 1)还是想要输出格式化文本(案例 2)。案例一很好并且易于使用,主要用于调试输出。 如果您想以明确的方式表达某些内容,格式化是更好的选择。 '+' 不是 Python 的字符串处理方式。

      % 的替代方法是 "{0} to the {1}".format(a,b),它是自 Python 3 以来的首选格式化方式。

      【讨论】:

      • str.format 是自 python 2.6 以来的首选格式化方式...
      • @Bakuriu: str.format 在 python 2.6 中是 python3 格式的反向移植。所以对于时间线来说,python 2.6.x和2.7.x是python 3.0之后的python版本。
      • 是的,但是当您说“X 出现在版本 Y 中”时,您的意思是每个(且唯一的)版本 Z >= Y 都提供该功能。在你的情况下,这是错误的。尽管2.6 出现在3.0 之后(及时),但它是关于功能的previous 版本。我的意思是,如果你有 python 2.6 <= 2.x 或 python 3.x >= 3.0,你应该使用 str.format。你的陈述只考虑了脱节。
      【解决方案4】:

      取决于哪个版本。

      Python 2 将是:

      print 'string'
      print 345
      print 'string'+(str(345))
      print ''
      

      Python 3 需要括号(希望不是个人)

      print ('string')
      print (345)
      print ('string'+(str(345))
      

      也是最万无一失的方法是将所有内容转换为变量:

      a = 'string'
      b = 345
      c = str(345)
      d = a + c
      

      【讨论】:

      • 这与问题无关。而对于将整数转换为字符串,'string%d'%345 要好得多。
      • 谢谢丹尼尔。 :) 当我可以提供帮助时,我个人不喜欢在我的代码中使用“%d”,但每个人都不一样。编辑:嘿伙计,我是新人,我想你不能看看我的列表拆分功能吗?
      猜你喜欢
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 2021-06-10
      • 2011-11-19
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多