Python 中的 !r 和 %r 有啥区别?

Posted

技术标签:

【中文标题】Python 中的 !r 和 %r 有啥区别?【英文标题】:What is the difference between !r and %r in Python?Python 中的 !r 和 %r 有什么区别? 【发布时间】:2016-01-10 21:03:57 【问题描述】:

正如标题所述,这两个标志之间有什么区别?似乎他们都使用 repr() 将值转换为字符串? 另外,在这行代码中:

"0!r:20".format("Hello")  

!r 前面的 0 有什么作用?

【问题讨论】:

0 表示“使用第 0 个位置参数”——仅当您要多次使用位置参数之一或需要支持 Python 2.6 时才需要它。 " ".format(...)` 会自动编号,以便在 Python 2.7 和 3.x 中被视为 "0 1".format(...) Python string formatting: % vs. .format的可能重复 【参考方案1】:

%r 不是str.format() 格式化操作中的有效占位符;它仅适用于old-style % string formatting。它确实通过repr() 函数将对象转换为表示。

str.format() 中,!r 是等价的,但这也意味着您现在可以将所有format codes 用于字符串。通常str.format() 会在对象本身上调用object.__format__() 方法,但是通过使用!r,会使用repr(object).__format__()

还有!s 和(在Python 3 中)!a 转换器;这些首先应用str()ascii() 函数。

前面的0 表示str.format() 方法的哪个参数将用于填充该槽;在您的情况下,位置参数0"Hello"。您也可以使用 named 参数,并将对象作为关键字参数传递:

"greeting!r:20".format(greeting="Hello")  

除非您使用的是 Python 2.6,否则您可以省略它,因为没有索引或名称的插槽会自动编号;第一个0,第二个 采用索引1 处的第二个参数,等等。

【讨论】:

谢谢,您能否澄清一下“这也意味着您现在可以使用字符串的所有格式代码”是什么意思? : 冒号之后的代码被传递给object.__format__() 方法,因此是特定于类型的。浮点数接受来自字符串的不同格式代码。因此,如果对象是浮点数,您将使用与添加 !r 时不同的格式代码。

以上是关于Python 中的 !r 和 %r 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

R中的()和[]有啥区别[关闭]

Java中的字符文字'\n'和'\r'有啥区别?

fopen中的r和rb有啥区别

R中的向量和列表数据类型有啥区别?

Ruby 中的“\n”(换行符)和“\r”(回车符)有啥区别?

Paxos 和 Cassandra 中的 W+R>=N 有啥区别?