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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章