"""不同""","引用",'类型'在功能?

时间:2017-05-12 15:27:44

标签: python function quote

我试图弄清楚不同的报价类型是否在功能上有所不同。我看到有人说它偏好PinXL.DisplayAlerts = False pinwb.save PinXL.DisplayAlerts = True ""但是''呢?我在一个简单的代码中对它进行了测试,看看它是否可以正常工作。我想知道""" """是否具有已定义函数参数的功能目的,还是只是另一个可以像""" triple quotes """""那样互换使用的引用选项?

正如我所看到的,有很多人发布关于''""的帖子,我没有看到有关''""" """在帖子中使用的帖子。

我的问题是:三重引号是否具有作为参数的独特用途,或者它是否可以与''' '''""互换?我认为它可能具有独特功能的原因是因为它是一个多行引用,我想知道它是否允许提交多行参数。我不确定这样的东西是否有用但可能是有用的。

这是一个使用我所知道的所有报价类型打印出您所期望的内容的示例。

''

结果:

def myFun(var1="""different""",var2="quote",var3='types'):
    return var1, var2, var3

print (myFun('All','''for''','one!'))

编辑:

在对三重引号进行了一些测试之后,我确实发现了函数中使用返回与打印的工作方式的一些变化。

('All', 'for', 'one!')

结果:

def myFun(var1="""different""",var2="""quote""",var3='types'):
    return (var1, var2, var3)

print(myFun('This',
'''Can
Be
Multi''',
'line!'))

或者:

('This', 'Can\nBe\nMulti', 'line!')

结果:

def myFun(var1="""different""",var2="""quote""",var3='types'):
    print (var1, var2, var3)

myFun('This',
'''Can
Be
Multi''',
'line!')

1 个答案:

答案 0 :(得分:3)

来自the docs

  

字符串文字可以用匹配的单引号(')或双引号(")括起来。它们也可以包含在三个单引号或双引号的匹配组中(这些通常称为三引号字符串)。 [...其他规则同样适用于省略的所有字符串文字类型...]

     

在三引号字符串中,允许(并保留)未转义的换行符和引号,除了连续三个未转义的引号终止字符串。 (“引用”是用于打开字符串的字符,即'"。)

因此,三引号字符串文字可以跨越多行,并且可以包含不使用转义序列的文字引号,但与其他引用类型表示的字符串文字完全相同(包括那些使用转义序列,例如\n\'来表达相同的内容。)

另请参阅Python 3文档:Bytes and String Literals - 它表达了一组有效的相同规则,但略有不同的措辞。

language tutorial中还提供了一个更温和的介绍,明确引入三引号作为允许字符串跨越多行的方法:

  

字符串文字可以跨越多行。一种方法是使用三引号:"""..."""'''...'''。行尾自动包含在字符串中,但可以通过在行尾添加\来防止这种情况。以下示例:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")
     

产生以下输出(请注意,不包括初始换行符):

     
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

要明确的是:它们是不同的语法,但它们创建的字符串文字彼此无法区分。也就是说,给出以下代码:

s1 = '''foo
'bar'
baz
'''
s2 = 'foo\n\'bar\'\nbaz\n'

没有办法通过查看s1s2的价值来区分s1 == s2repr(s1) == repr(s2)id(s1) == id(s2)为真,import也是如此。甚至允许Python解释器将它们实例化为相同的值,因此可能(或可能不)使1.8.2为真,具体取决于细节(例如代码是否在REPL上运行)或record Thing { decimal(10,2) foo; } 作为模块)。