在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)