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

在python中传递数据以打印的更好方法,python,Python,我仔细检查后发现: >>> 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 据指出,最后一个符号更明确,更不容易出错,是首选。 我想知道使用最后一个符号有什么好处。。它不会有性能开销吗?我能想到一些不同

我仔细检查后发现:

>>> 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
据指出,
最后一个符号更明确,更不容易出错,是首选。


我想知道使用最后一个符号有什么好处。。它不会有性能开销吗?

我能想到一些不同之处

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

  • 第二个示例是位置相关的,很容易改变位置导致错误。它也不会告诉你任何关于变量的事情

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

  • 请参见下面的示例:

    >>> 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在下面所说,连接比格式化快。

    建议是

  • 如果只连接两个字符串,请使用第一种形式-连接

  • 如果变量很少,则使用第二种形式。你总是可以看到他们的立场,并处理他们

  • 使用第三种形式进行模板制作,即使用变量数据格式化一大块字符串。字典形式有助于为大块文本中的变量提供含义

  • 我想知道有什么好处 使用最后一个符号的方法

    嗯,正如你所说的,最后一个符号实际上更显式,而且更不容易出错

    不会有表演吗 头顶

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

    >>> print 'number is ' + str(3)
    number is 3
    
    这绝对是最糟糕的解决方案,如果您犯了obj:+obj值的初学者错误,
    obj
    不是字符串或unicode对象,可能会给您带来问题。对于许多连接,它根本不可读-类似于
    echo“Hello”$username.!

    ”(这可能会变得任意丑陋)。

    “打印”编号为%s“%”(3) 号码是3

    现在好多了。您可以立即看到输出格式,而不是难以读取的串联。回到输出值的初学者错误,例如,您可以执行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查找格式。

    这是一条错误的、没有道理的建议。

    第三种方法很麻烦,容易出错,除非:

  • 您正在编写一个无法控制格式字符串的框架。例如,
    logging
    模块、
    web2py
    gettext
  • 格式字符串非常长
  • 格式字符串是从配置文件的文件中读取的
  • 当您认为代码< > FoO 出现在代码中三次时,第三种方法应该是明显的:<代码>“%(FoO)s”%DIST(FoO=FO)< /代码>。这很容易出错。大多数程序不应该使用第三种方法,除非他们知道需要

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

    第一个串联几乎没有任何用处,除非您正在按循环构建列表:

    s = ''
    for x in l:
        s += str(x)
    
    但是,在这种情况下,使用str.join()通常更好更快:


    @格雷格·休吉尔:见上面我的答案。我想这不是关于性能,而是关于如果我们依赖变量的位置进行格式化,可能会导致的其他错误。使用串联运算符比格式化运算符快得多,格式化运算符本身比
    .format
    方法慢得多。我建议在合理的情况下在诸如内部循环之类的地方使用连接。@aaronasterling:如果需要性能,最糟糕的做法是使用+运算符并调用O(n**2)行为;如果需要性能,请改用str.join()。@Lie Ryan,多个串联的优点。我通常不会用它来做更多的事情,所以我不会考虑两个以上的字符串。@Lie Ryan:@aaronasterling:我同意
    s = ''.join(str(x) for x in l)