我正在经历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.
我想知道使用最后一种表示法有什么好处..它不会有性能开销吗?
答案 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)
我可以想到一些差异。
如果涉及多个变量,首先对我来说很麻烦。我不能谈论性能上的惩罚。请参阅下面的其他参数。
第二个示例是位置相关的,可以很容易地更改位置导致错误。它也没有告诉你关于变量的任何信息。
第三个例子,变量的位置并不重要。你使用字典。这使它变得优雅,因为它不依赖于变量的位置结构。
请参阅以下示例:
>>> 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在下面所说,连接比格式化更快。
建议
使用第一种表单 - 连接,如果只连接两个字符串
如果变量很少,请使用第二种格式。你总能看到这些职位并与他们打交道
在进行模板化时使用第三种形式,即使用可变数据格式化大块字符串。字典表单有助于为大块文本中的变量提供意义。
答案 2 :(得分:0)
我想知道什么是优势 使用最后一种表示法..
嗯,正如你所说,最后一种表示法实际上是显式,实际上不易出错。
它没有表现 开销?
它的性能开销很小,但与从数据库或网络连接中获取的数据相比,它是次要的。
答案 3 :(得分:0)
这是一个糟糕的,不合理的建议。
第三种方法繁琐,违反DRY,容易出错,除非:
logging
模块,web2py
或gettext
。当您考虑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)