Python 中的格式化程序 %r 和 \n 发生了什么?

What happened with formatter %r and \n in Python?

我正在学习学习 Python 艰难之路。这是练习9的学生常见问题

中的内容

为什么我使用 %r 时 \n 换行不起作用?

这就是 %r 格式的工作原理,它按照您编写的方式(或接近它的方式)打印它。这是用于调试的"raw"格式

然后我试了一下,但它对我有效!

我的代码:

# test %r with \n
print "test\n%r\n%r" % ("with", "works?")

# change a way to test it
print "%r\n%r" % ("with", "works?")

输出:

test
'with'
'works?'
'with'
'works?'

我很疑惑,是我的考试有问题还是书有问题? 你能给我举一些例子吗?非常感谢。

那不是您会看到 %r 效果的地方。将换行符 ('\n') 等转义字符放入将替换 %r:

的字符串中
>>> print "%r\n%r" % ("with\n", "works?")
'with\n'
'works?'

现在用%s代替str()表示,而不是repr()表示,看看区别:

>>> print "%s\n%s" % ("with\n", "works?")
with

works?

您将 原始字符串文字 %r (repr()) 字符串格式化程序混淆了。它们不是一回事。

您定义了一个字符串文字:

'This is a string with a newline\n'

这会生成一个字符串对象。然后,您将该字符串对象与 % 运算符一起使用,这使您可以根据放在 % 的 right-hand 侧的任何内容,将任何标记为 % 的占位符替换为值操作员。 %r 占位符使用 repr() 为给定对象生成字符串并将该字符串插入插槽。

如果您希望 \n 被解释为文字反斜杠和分隔 n 字符,请使用 原始字符串文字 ,前缀为 [=23] =]:

r'This is a string with a literal backslash and letter n: \n'

如果您希望%r产生转义的(Python)语法,将换行符放入右边的值; repr() string 产生字符串文字语法:

'This will show the string in Python notation: %r' % ('String with \n newline',)

这会获取 repr('String with \n newline') 的输出并将其插入到字符串中:

>>> 'String with \n newline'
'String with \n newline'
>>> repr('String with \n newline')
"'String with \n newline'"
>>> print repr('String with \n newline')
'String with \n newline'
>>> 'This will show the string in Python notation: %r' % ('String with \n newline',)
"This will show the string in Python notation: 'String with \n newline'"
>>> print 'This will show the string in Python notation: %r' % ('String with \n newline',)
This will show the string in Python notation: 'String with \n newline'