为什么使用%r的这两个输出之间的差异是python中的单引号和双引号

时间:2014-12-29 16:08:32

标签: python

binary = "binary"
do_not = "don't"
x = "There are %s types of people." % binary
y = "Those who know %s and those who %s." % (binary, do_not)

print "I also said: %r." % y
print "I also said: %r." % x   

这是学习Python的练习。我正在尝试理解'%r',所以我尝试了上面的两个版画。输出

I also asid: "Those who know binary and those who don't.".
I also said: 'There are binary types of people.'.

现在我想知道为什么这两个版画的区别是双引号和单引号? 谢谢你的帮助。

3 个答案:

答案 0 :(得分:6)

%r格式会导致Python使用repr函数进行打印。所以以下是等价的:

"%r" % my_string  ≡  "%s" % repr(my_string)

那么问题就变成了,为什么repr有时会使用单引号,有时会使用双引号?好吧,首先,repr目标是生成一个Python对象的表示,它也是有效的Python源代码(这不是强制性要求,但对于许多Python类型,它确实是有效)。对于包含撇号的字符串,有多种方式来表示它:

"Don't"  ≡  'Don\'t'

repr决定“聪明”并选择一个更易于阅读的内容,即使用双引号,只要它不包含双引号即可。在所有其他情况下,Python回退到默认的单引号。这就是为什么你会看到不同字符串的不同行为。

更相关的是,不要依赖repr(或%r引用供人类消费的字符串,为此编写自己的函数。它并不意味着,它主要用作调试时转储Python对象的便捷方式。

AFAIK没有明确规定当你repr字符串时你会得到什么的文件,除了预期eval(repr(my_string)) == my_string成立。

答案 1 :(得分:0)

因为如果don't使用单引号,如果字符串包含单引号,则python automaticaly将其放在双引号"中。否则它将字符串放在单引号中。

>>> x
'There are binary types of people.'
>>> y
"Those who know binary and those who don't."

注意:您不能在单引号中添加包含单引号的字符串,它会引发syntax error

>>> 'Those who know binary and those who don't.'
  File "<stdin>", line 1
    'Those who know binary and those who don't.'
                                             ^
SyntaxError: invalid syntax

%r使用repr()转换任何Python对象(返回包含对象的可打印表示的字符串。)。

  

这与转化(反向引号)产生的值相同。能够以普通函数的形式访问此操作有时很有用。对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval()时会产生具有相同值的对象,否则表示形式是一个用尖括号括起来的字符串,它包含对象类型的名称附加信息通常包括对象的名称和地址。类可以通过定义__repr__()方法来控制此函数为其实例返回的内容。

>>> repr("example")
"'example'"
>>> repr("exampl'e")
'"exampl\'e"'

详细了解String Formatting

答案 2 :(得分:0)

那么让我举个例子

print "Let's try this example"

以下示例将打印正常但如果您使用单引号,它将在let的'之后退出。

这是另一个例子

print 'He said "Hello!"'

如果你在这里使用双引号,那么它将在 Hello!之前转义。这些是简单的用例。如果您使用的输出html标签需要单引号或双引号,它们会派上用场。