<p>好吧,看看表达式、文字和字符串的概念会有帮助。</p>
<h2>字符串、表达式和文字</h2>
<p>在程序中,我们必须表示各种类型的数据。一种是整数,另一种是浮点数。</p>
<p>某种类型的值可以通过各种方式产生,即通过各种<em>表达式</em>。<em>表达式</em>是“创建”值的程序的任何片段。例如,下面的Python表达式生成值4并将其放入变量中。该值由<em>表达式</em><code>2+2</code>产生:</p>
<pre><code>i = 2+2
</code></pre>
<p>给定上面的语句,下面的<em>表达式</em>产生相同的值4,但是现在这个表达式只包含一个<em>变量</em>:</p>
<pre><code>i
</code></pre>
<p>下面,我通过<em>算术表达式</em>生成一个值,并通过<em>变量</em>检索它(这也是一个表达式)。</p>
<p>然而,语言应该提供直接产生基本值的语法。例如,上面表达式中的<code>2</code>检索值2。那些直接产生基本值的表达式称为<em>文字</em>。两个表达式<code>2+2</code>和<code>4</code>产生相同的值4,但是第二个表达式直接产生它,所以它是一个文本。</p>
<h2>字符串文字和多行字符串</h2>
<p>一种非常重要的数据类型是文本、一系列字母、数字和其他字符。这种类型通常称为<em>字符串</em>。</p>
<p>这样,A<em>string literal</em>就是生成字符串的literal。在Python中,这些文本通过多种方式进行标记(即,字符串文本有许多语法)。例如,可以在文字的开头或结尾处放置一个单引号或双引号:</p>
<pre><code>"A string literal"
'Another string literal'
</code></pre>
<p>其他方法是将三个单引号或双引号放在同一位置。在这种情况下,文字可以跨越多行:</p>
<pre><code>"""A single line string literal"""
"""A multiline
string literal"""
'''Another multiline
string literal'''
</code></pre>
<p>请注意,无论选择何种语法作为字符串文本,它都不会更改其值。单引号字符串等于具有相同字符的双引号字符串,三引号字符串等于具有相同内容的单引号字符串:</p>
<pre><code>>>> "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
</code></pre>
<h2>Docstrings以及它们为什么应该是字符串文本</h2>
<p>文档所说的是,您可以在方法声明之后放置一个字符串文本,这个文本将用作文档-我们用来调用a<em>docstring</em>。使用单引号或双引号字符串或单引号或三引号字符串并不重要:它只需要是<em>文本</em>。</p>
<p>考虑以下功能:</p>
<pre><code>def f1(value):
"Doc for f1"
return value + 1
def f2(value):
"""Doc for f2"""
return value + 2
</code></pre>
<p>现在,在python控制台中声明它们并调用<code>help(f1)</code>和<code>help(f2)</code>。请注意,字符串文本的语法无关紧要。</p>
<p>OTOH,不能使用其他表达式(如变量或字符串上的操作)来生成文档。因此<em>下面函数第一行的字符串不是docstring</em>:</p>
<pre><code>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
</code></pre>
<p>它应该是一个文本,因为编译器<em>是显式地</em>编写来作为文档管理的。但是,编译器不准备将变量、复杂表达式等作为文档进行管理,因此将忽略它们。换句话说,这是设计的。</p>
<h2>为什么使用三引号字符串作为docstring?</h2>
<p>尽管任何形式的字符串文字都可以在docstring中使用,但您可能会认为文档通常包含非常长的文本,其中包含多行和多段。好吧,因为它包含许多行,所以最好使用接受多行的文字形式,对吧?这就是为什么三引号字符串是编写docstring的首选(但不是强制)方式的原因。</p>
<h2>旁注</h2>
<p>实际上,可以将字符串文字放在Python函数的任何位置:</p>
<pre><code> 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"
</code></pre>
<p>然而,只有第一行中的文字才有区别(作为文件)。其他的就像没有操作一样。</p>