更好的方法来传递数据在python中打印

时间:2010-10-24 07:07:38

标签: python

我正在经历http://web2py.com/book/default/chapter/02并发现了这个:

>>> print 'number is ' + str(3)
number is 3
>>> print 'number is %s' % (3)
number is 3
>>> print 'number is %(number)s' % dict(number=3)
number is 3

已经给出了The last notation is more explicit and less error prone, and is to be preferred.

我想知道使用最后一种表示法有什么好处..它不会有性能开销吗?

4 个答案:

答案 0 :(得分:4)

>>> print 'number is ' + str(3)
number is 3

这绝对是最糟糕的解决方案,如果你做初学者错误"Value of obj: " + obj obj {}不是字符串或unicode对象,可能会导致问题。对于许多连接,它根本不可读 - 它类似于PHP中的echo "<p>Hello ".$username."!</p>";(这可能会变得任意丑陋)。

<小时/>

  
    
      

打印'号码是%s'%(3)           数字是3

    
  

现在情况好多了。您可以立即看到输出格式,而不是难以读取的串联。回到初学者输出值的错误,你可以做print "Value of obj: %r" % obj,例如。在大多数情况下我个人更喜欢这个。但请注意,如果您有多个格式说明符,则不能在gettext-translated字符串中使用它,因为顺序可能会在其他语言中更改。

如你忘了在这里提到的那样,你也可以使用类似的新字符串格式化方法:

>>> "number is {0}".format(3)
'number is 3'

<小时/> 接下来,dict查找:

>>> print 'number is %(number)s' % dict(number=3)
number is 3

如前所述,gettext-translated字符串可能会更改位置格式说明符的顺序,因此在使用翻译时,此选项最佳。性能下降应该可以忽略不计 - 如果你的程序不是关于格式化字符串的话。

与位置格式一样,您也可以使用新样式:

>>> "number is {number}".format(number=3)
'number is 3'

<小时/> 很难分辨哪一个。我建议你使用带有%表示法的位置参数来表示简单的字符串,并使用dict查找格式来翻译字符串。

答案 1 :(得分:2)

我可以想到一些差异。

  1. 如果涉及多个变量,首先对我来说很麻烦。我不能谈论性能上的惩罚。请参阅下面的其他参数。

  2. 第二个示例是位置相关的,可以很容易地更改位置导致错误。它也没有告诉你关于变量的任何信息。

  3. 第三个例子,变量的位置并不重要。你使用字典。这使它变得优雅,因为它不依赖于变量的位置结构。

  4. 请参阅以下示例:

    >>> print 'number is %s %s' % (3,4)
    number is 3 4
    >>> print 'number is %s %s' % (4,3)
    number is 4 3
    >>> print 'number is %(number)s %(two)s' % dict(number=3, two=4)
    number is 3 4
    >>> print 'number is %(number)s %(two)s' % dict(two=4, number=3)
    number is 3 4
    >>> 
    

    此讨论的另一部分

    “+”是字符串连接运算符。

    “%”是字符串格式。

    在这种简单的情况下,字符串格式化实现与连接相同的结果。与字符串格式不同,字符串连接仅在所有内容都是字符串时才有效。因此,如果您错过将变量转换为字符串,则连接将导致错误。

    [编辑:我的回答偏向于模板,因为问题来自web2py,其中模板通常涉及]

    正如Ryan在下面所说,连接比格式化更快。

    建议

    1. 使用第一种表单 - 连接,如果只连接两个字符串

    2. 如果变量很少,请使用第二种格式。你总能看到这些职位并与他们打交道

    3. 在进行模板化时使用第三种形式,即使用可变数据格式化大块字符串。字典表单有助于为大块文本中的变量提供意义。

答案 2 :(得分:0)

  

我想知道什么是优势   使用最后一种表示法..

嗯,正如你所说,最后一种表示法实际上是显式,实际上不易出错。

  

它没有表现   开销?

它的性能开销很小,但与从数据库或网络连接中获取的数据相比,它是次要的。

答案 3 :(得分:0)

这是一个糟糕的,不合理的建议。

第三种方法繁琐,违反DRY,容易出错,除非:

  1. 您正在编写一个无法控制格式字符串的框架。例如,logging模块,web2pygettext
  2. 格式字符串非常长。
  3. 从配置文件中的文件中读取格式字符串。
  4. 当您考虑foo在此代码中出现三次时,第三种方法的问题应该很明显:"%(foo)s" % dict(foo=foo)。这很容易出错。大多数程序不应使用第三种方法,除非他们知道需要。

    第二种方法是最简单的方法,也是大多数程序中通常使用的方法。最好在格式字符串是立即时使用,例如'values: %s %s %s' % (a, b, c)而不是取自变量,例如fmt % (a, b, c)

    第一个连接几乎从来没有用过,除非您正在逐个循环构建列表:

    s = ''
    for x in l:
        s += str(x)
    

    然而,在这种情况下,使用str.join()通常会更好更快:

    s = ''.join(str(x) for x in l)