3

我正在一本 python 书中进行练习,我对这段代码中发生的事情感到有些困惑。

formatter = "%r %r %r %r"

print formatter % (1, 2, 3, 4)
print formatter % ("one", "two", "three", "four")
print formatter % (True, False, False, True)
print formatter % (formatter, formatter, formatter, formatter)
print formatter % (
    "I had this thing.",
    "That you could type up right.",
    "But it didn't sing.",
    "So I said goodnight."
)

作者没有解释每次“打印”后“格式化程序”在做什么。如果我删除它们,所有打印出来的内容都完全相同。我在这里错过了什么吗?

4

3 回答 3

2

不,它不会打印出完全相同的东西。formatter %如果您使用该部分,则没有逗号和括号。

如果扩展格式化程序会更清楚。我建议你使用:

formatter = "One: %r, Two: %r, Three: %r, Four: %r"

反而。

格式化程序充当模板,每个模板都%r充当右侧元组中值的占位符。

于 2013-03-07T19:30:34.260 回答
2

formatter是一个字符串。因此,第一行与以下内容相同:

"%r %r %r %r" % (1, 2, 3, 4)

它调用repr右侧元组中的每个项目,并用%r结果替换相应的项目。当然,它对

formatter % ("one", "two", "three", "four")

等等。

请注意,您通常还会看到:

"%s %s %s %s" % (1, 2, 3, 4)

它调用str而不是repr. (在您的示例中,我认为str并为所有这些对象返回相同的内容,因此如果您更改为使用而不是,repr输出将完全相同)formatter%s%r

于 2013-03-07T19:31:15.523 回答
2

这是字符串格式化的经典格式,print "%r" % var将打印 var 的原始值,四个 %r 期望在 % 之后传递 4 个变量。

一个更好的例子是:

formatter = "first var is %r, second is %r, third is %r and last is %r"
print formatter % (var1, var2, var3, var4)

使用格式化程序变量只是为了避免在打印中使用长行,但通常不需要这样做。

print "my name is %s" % name
print "the item %i is $%.2f" % (itemid, price)

%.2f是浮点数,逗号后有 2 个值。

您可能希望尝试一种较新的字符串格式变体:(如果您至少使用 2.6)

print "my name is {name} I'm a {profession}".format(name="sherlock holmes", profession="detective")

更多信息:

http://www.python.org/dev/peps/pep-3101/

http://pythonadventures.wordpress.com/2011/04/04/new-string-formatting-syntax/

于 2013-03-07T19:39:48.057 回答