字符串文字,在函数定义中带有三引号

Est*_*ius 55 python string literals

我正在关注Python教程,并且在某些时候他们讨论了函数的第一个语句如何是String Literal.就例子而言,这个String Literal似乎是用三个"s 来完成的,在这个例子中给出了

"""Print a Fibonacci series up to n."""
Run Code Online (Sandbox Code Playgroud)

根据此文档,这将主要用于创建某种自动生成的文档.

所以我想知道这里是否有人可以向我解释这些字符串文字究竟是什么?

mgi*_*son 63

你所说的(我认为)被称为docstrings(感谢Boud的链接).

def foo():
    """This function does absolutely nothing"""
Run Code Online (Sandbox Code Playgroud)

现在,如果您help(foo)从解释器中键入,您将看到我放在函数中的字符串.您也可以通过访问该字符串foo.__doc__

当然,字符串文字就是 - 文字字符串.

a = "This is a string literal"  #the string on the right side is a string literal, "a" is a string variable.
Run Code Online (Sandbox Code Playgroud)

要么

foo("I'm passing this string literal to a function")
Run Code Online (Sandbox Code Playgroud)

它们可以通过多种方式定义:

'single quotes'
"double quotes"
""" triple-double quotes """  #This can contain line breaks!
Run Code Online (Sandbox Code Playgroud)

甚至

#This can contain line breaks too!  See?
''' triple-single 
    quotes '''
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用文档字符串,您也可以跳过函数 `foo` 中的 `pass`。 (2认同)

bra*_*zzi 35

好吧,看看表达式,文字和字符串的概念会很有帮助.

字符串,表达式和文字

在程序中,我们必须表示各种类型的数据.一个类型的数据是整数; 其他类型是浮点数.

某种类型的值可以通过各种方式产生,即通过各种表达.一个表达式是"创建"的值的程序的任何片段.例如,下面的Python表达式产生值4并将其放在变量中.该值由以下表达式 得出2+2:

i = 2+2
Run Code Online (Sandbox Code Playgroud)

鉴于上面的陈述,下面的表达式产生相同的值4,但现在这个表达式只包含一个变量:

i
Run Code Online (Sandbox Code Playgroud)

下面,我通过算术表达式生成一个值,并通过变量(也是一个表达式)检索它.

但是,语言应提供直接生成基本值的语法.例如,2上面的表达式中检索值2.直接产生基本值的表达式称为文字.两个表达式2+24得到相同的值,如图4所示,但第二个表达式直接得到它,因此它是一个文字.

字符串文字和多行字符串

一种非常重要的数据类型是文本,一系列字母,数字和其他字符.这种类型通常称为字符串.

一个文本字符串,以这种方式,是文字这将产生一个字符串.在Python中,这些文字以多种方式标记(即,字符串文字有许多语法).例如,您可以在文字的开头或结尾放置单引号或双引号:

"A string literal"

'Another string literal'
Run Code Online (Sandbox Code Playgroud)

其他方法是将三个单引号或双引号放在相同的位置.在这种情况下,文字可以跨越多行:

"""A single line string literal"""

"""A multiline
string literal"""

'''Another multiline
string literal'''
Run Code Online (Sandbox Code Playgroud)

请注意,无论您选择哪种语法字符串文字,它都不会更改其值.单引号字符串等于具有相同字符的双引号字符串,并且三引号字符串等于具有相同内容的单引号字符串:

>>> "A single line string literal" == 'A single line string literal'
True

>>> """A single line string literal""" == "A single line string literal"
True

>>> # \n is the character that represents a new line
>>> "A multiline\nstring literal" == """A multiline
string literal""" 
True
Run Code Online (Sandbox Code Playgroud)

Docstrings以及为什么它们应该是字符串文字

文档说的是你可以在方法声明之后放一个字符串文字,这个文字将用作文档 - 我们用来调用docstring.如果你使用单引号或双引号字符串,或者一个或三个引用字符串也没关系:它只需要是文字.

考虑以下功能:

def f1(value):
    "Doc for f1"
    return value + 1

def f2(value):
    """Doc for f2"""
    return value + 2
Run Code Online (Sandbox Code Playgroud)

现在,在你的python控制台中声明它们并调用help(f1)help(f2).请注意,字符串文字的语法无关紧要.

OTOH,您不能使用其他表达式(如变量或字符串操作)来生成文档.所以下面函数第一行的字符串不是docstring:

mydoc = "This is doc"
def f3(value):
     mydoc
     return value+3

 def f4(value):
     "This is no documentation " + "because it is concatenated"
     return value+4
Run Code Online (Sandbox Code Playgroud)

它应该是文字,因为编译器是明确编写的,以将其作为文档进行管理.但是,编译器不准备将变量,复杂表达式等作为文档进行管理,因此它将忽略它们.换句话说,它是设计的.

为什么使用三引号字符串作为文档字符串?

尽管可以在文档字符串中使用任何形式的字符串文字,但您可以认为文档通常包含非常长的文本,包含多行和多段.好吧,因为它包含很多行,最好使用接受多行的文字形式,对吧?这就是为什么三引号字符串是编写文档字符串的首选(但不是强制)方式的原因.

边注

实际上,您可以将字符串文字放在Python函数的任何位置:

 def flying_literals(param):
    "Oh, see, a string literal!"
    param += 2
    "Oh, see, ANOTHER string literal!"
    return param
    "the above literal is irrelevant, but this one can be still MORE IRRELEVANT"
Run Code Online (Sandbox Code Playgroud)

但是,只有第一行的文字才有所不同(作为文档).其他的就像无操作操作.

  • 很抱歉有这样的评论,但这是本主题最全面,最完整的答案之一.边缘笔记是我正在寻找的.谢谢! (2认同)

Sve*_*ach 7

字符串文字只是源代码中字面上给出的字符串.无论是docstring还是其他字符串都没关系.有关所有详细信息,请参阅字符串文字Python语言文档部分,但您现在可能不需要这些详细信息.

几个例子:

"abc"
'Guido'
r"""Norwegian Blue"""
Run Code Online (Sandbox Code Playgroud)


Bur*_*lid 7

字符串文字是许多引用选项之一中的字符串,未分配给变量.

所以,

"String" # string literal
'string' # string literal
"""
  Multiline
  String
  Literal
"""
foo = "string variable"
Run Code Online (Sandbox Code Playgroud)

如果在def块之后立即有字符串文字,它将成为该方法文档的一部分,并称为docstring

def foo(hello):
    """This is part of the documentation for foo"""
Run Code Online (Sandbox Code Playgroud)

这是你如何使用它:

>>> def foo(hello):
...     """This is the docstring"""
...     pass
... 
>>> foo.__doc__
'This is the docstring'
Run Code Online (Sandbox Code Playgroud)


Zau*_*bov 5

在 Python 中,有多种方法可以将字符串分成多行。字符串文字就是其中之一,例如:

s = """Hello,
    world"""
print(s)
>>> Hello,
>>>     world #Notice, that spaces used in the literal are kept.
Run Code Online (Sandbox Code Playgroud)

但是正如您正确注意到的那样,字符串文字通常用于内嵌文档

class MyClass(object):
    """This is my class it does this and that.

       It has some cool features and I may tell you about them below.
    """

    def my_method(self):
        """This is a brief description of my method."""

    def important_method(self):
        """Because this method is important, I'm going to tell you
           a lot about it. For example...
        """
Run Code Online (Sandbox Code Playgroud)

在你问之前,在多行上拆分字符串的好方法是神圣的 Python 括号:

s = ('This is a very very long string. '
     'I have to split it to multiple lines. '
     'Whoa! It works!')
print(s)
>>> This is a very very long string. I have to split it to multiple lines. Whoa! It works!
Run Code Online (Sandbox Code Playgroud)

您可能需要它来遵循 PEP-8,其中规定“每行不得超过 80 个字符”。

快乐的 Python 黑客攻击!