2. 词汇分析

python程序由 语法分析器 . 解析器的输入是一个流 令牌 ,由 词汇分析器 . 本章介绍词汇分析器如何将文件拆分为标记。

python以unicode代码点的形式读取程序文本;源文件的编码可以通过编码声明提供,并默认为utf-8,请参见 PEP 3120 详情。如果源文件无法解码,则 SyntaxError 提高了。

2.1. 线结构

一个python程序被划分为 逻辑线 .

2.1.1. 逻辑线

逻辑行的结尾由标记换行符表示。语句不能跨越逻辑行边界,除非语法允许换行(例如,复合语句中的语句之间)。逻辑行是由一个或多个 物理线 通过遵循显式或隐式 线条连接 规则。

2.1.2. 物理线

物理行是以行尾序列结尾的字符序列。在源文件和字符串中,可以使用任何标准平台行终止序列-Unix表单使用ASCII LF(linefeed),Windows表单使用ASCII序列CR LF(return后跟linefeed),或旧的Macintosh表单使用ASCII CR(return)字符。无论平台如何,所有这些表单都可以被平等地使用。输入端还充当最终物理行的隐式终止符。

在嵌入python时,源代码字符串应该使用换行符的标准C约定传递给python API(即 \n 字符,代表ASCIILF,是行终止符)。

2.1.3. 评论

注释以哈希字符开头 (# )它不是字符串文字的一部分,并以物理行的结尾结束。注释表示逻辑行的结尾,除非调用隐式行连接规则。注释被语法忽略。

2.1.4. 编码声明

如果python脚本第一行或第二行中的注释与正则表达式匹配 coding[=:]\s*([-\w.]+) ,此注释作为编码声明进行处理;此表达式的第一组命名源代码文件的编码。编码声明必须出现在自己的行上。如果是第二行,则第一行也必须是注释行。编码表达式的建议格式为:

# -*- coding: <encoding-name> -*-

它也被GNU Emacs识别,并且:

# vim:fileencoding=<encoding-name>

这是由布拉姆·穆勒纳的VIM识别的。

如果找不到编码声明,则默认编码为UTF-8。此外,如果文件的第一个字节是UTF-8字节顺序标记 (b'\xef\xbb\xbf' )声明的文件编码为UTF-8(除其他外,Microsoft的 notepad

如果声明了编码,则必须由python识别编码名称。编码用于所有词汇分析,包括字符串文本、注释和标识符。

2.1.5. 显式线条连接

可以使用反斜杠字符将两个或多个物理行联接到逻辑行中。 (\ ,如下所示:当一个物理行以反斜杠结尾,而该反斜杠不是字符串文字或注释的一部分时,它与下面的一行连接,形成一个逻辑行,删除反斜杠和下面的行尾字符。例如::

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

以反斜杠结尾的行不能带有注释。反斜杠不继续注释。反斜杠不继续标记,字符串文本除外(即,字符串文本以外的标记不能使用反斜杠跨物理行拆分)。反斜杠在字符串文字之外的行的其他地方是非法的。

2.1.6. 隐式线条连接

括号、方括号或大括号中的表达式可以拆分为多个物理行,而不使用反斜杠。例如::

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year

隐式续行可以带注释。连续行的缩进并不重要。允许空白续行。隐式续行之间没有换行标记。隐式连续行也可以出现在三重引号字符串中(见下文);在这种情况下,它们不能携带注释。

2.1.7. 空白行

只包含空格、制表符、表单源和可能包含注释的逻辑行将被忽略(即,不生成换行标记)。在语句的交互输入过程中,根据read eval print循环的实现,对空行的处理可能有所不同。在标准的交互式解释器中,一个完全空白的逻辑行(即一个不包含空格或注释的逻辑行)终止一个多行语句。

2.1.8. 缩进

逻辑行开头的前导空格(空格和制表符)用于计算行的缩进级别,而后者又用于确定语句的分组。

制表符被1到8个空格替换(从左到右),这样,到替换为止(包括替换在内)的字符总数是8的倍数(这与Unix使用的规则相同)。第一个非空白字符前面的空格总数,然后确定行的缩进量。不能使用反斜杠在多个物理行上拆分缩进;到第一个反斜杠的空白决定了缩进。

如果源文件混合制表符和空格的方式使含义依赖于制表符在空格中的值,则拒绝缩进,因为缩进不一致;a TabError 在这种情况下被引发。

Cross-platform compatibility note: 由于非UNIX平台上文本编辑器的特性,在单个源文件中使用混合空格和制表符进行缩进是不明智的。还应注意的是,不同的平台可能明确限制最大缩进级别。

换行符可能出现在行首;对于上面的缩进计算,它将被忽略。前导空格中其他地方出现的formfeed字符具有未定义的效果(例如,它们可能会将空格计数重置为零)。

连续行的缩进级别用于使用堆栈生成缩进和除数标记,如下所示。

在读取文件的第一行之前,在堆栈上推一个零;这将永远不会再次弹出。在堆栈上推送的数字总是从下到上严格递增。在每个逻辑行的开头,行的缩进级别与堆栈的顶部进行比较。如果相等,什么也不会发生。如果更大,则将其推送到堆栈上,并生成一个缩进标记。如果小一点的话 must 是发生在堆栈上的数字之一;堆栈上所有较大的数字都将弹出,并为每个弹出的数字生成一个DEDENT标记。在文件的末尾,会为堆栈上剩余的大于零的每个数字生成一个DEDENT标记。

下面是一个正确(尽管令人困惑)缩进的Python代码示例:

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r

以下示例显示了各种缩进错误:

 def perm(l):                       # error: first line indented
for i in range(len(l)):             # error: not indented
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # error: unexpected indent
        for x in p:
                r.append(l[i:i+1] + x)
            return r                # error: inconsistent dedent

(实际上,前三个错误是由解析器检测到的;只有最后一个错误是由词法分析器发现的---缩进 return r 与从堆栈中弹出的级别不匹配。)

2.1.9. 符号间的空白

除了在逻辑行的开头或字符串文本中,空白字符空格、制表符和换行符可以交替使用来分隔标记。只有当两个令牌的连接可以被解释为不同的令牌(例如,AB是一个令牌,而A B是两个令牌)时,才需要在两个令牌之间使用空白。

2.2. 其它语言符号

除了换行、缩进和DEDEDENT之外,还存在以下类别的令牌: 标识符关键词字面量算子delimiters . 空白字符(前面讨论过的行终止符除外)不是标记,而是用来分隔标记。如果存在歧义,则当从左向右读取时,标记包含构成合法标记的最长可能字符串。

2.3. 标识符和关键字

标识符(也称为 姓名 )由以下词汇定义描述。

python中标识符的语法基于Unicode标准附件UAX-31,其详细说明和更改如下所述;另请参见 PEP 3131 更多详情。

在ascii范围内(u+0001..u+007f),标识符的有效字符与python 2.x中相同:大写和小写字母 A 通过 Z ,下划线 _ 除第一个字符外,数字 0 通过 9 .

python 3.0引入了ASCII范围之外的其他字符(请参见 PEP 3131 )。对于这些字符,分类使用Unicode字符数据库的版本,如 unicodedata 模块。

标识符的长度不受限制。案例很重要。

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">

上面提到的Unicode类别代码代表:

  • Lu -大写字母

  • Ll -小写字母

  • Lt -标题字母

  • Lm -修饰字母

  • Lo -其他信件

  • Nl -字母编号

  • Mn -非间距标记

  • Mc -间距组合标记

  • Nd -十进制数

  • Pc -连接线标点

  • Other_ID_Start -中的显式字符列表 PropList.txt 支持向后兼容性

  • Other_ID_Continue -同样

解析时,所有标识符都转换为正常形式的NFKC;标识符的比较基于NFKC。

列出Unicode 4.1的所有有效标识符字符的非标准HTML文件可以在https://www.unicode.org/Public/13.0.0/ucd/DerivedCoreProperties.txt

2.3.1. 关键词

以下标识符用作保留字,或 关键词 语言,不能用作普通标识符。它们的拼写必须与此处所写的完全一致:

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

2.3.2. 保留的标识符类型

某些类别的标识符(关键字除外)具有特殊含义。这些类由前导和尾随下划线字符的模式标识:

_*

不输入的 from module import * . 特殊标识符 _ 在交互式解释器中用于存储上次评估的结果;它存储在 builtins 模块。不处于交互模式时, _ 没有特殊含义,也没有定义。见节 这个 import 陈述 .

注解

名字 _ 通常与国际化结合使用;请参阅文档以了解 gettext 有关本公约的更多信息。

__*__

系统定义的名称,非正式地称为“dunder”名称。这些名称由解释器及其实现(包括标准库)定义。当前系统名称在 特殊方法名称 科室和其他地方。在未来的Python版本中可能会定义更多的内容。 Any 使用 __*__ 在任何上下文中,不遵循明确记录的用法的名称都会在没有警告的情况下被破坏。

__*

类专用名称。当在类定义的上下文中使用此类中的名称时,将重新编写以使用损坏的表单,以帮助避免基类和派生类的“private”属性之间的名称冲突。见节 标识符(名称) .

2.4. 直接常量

文字是一些内置类型的常量值的符号。

2.4.1. 字符串与字节的字面值

字符串文本由以下词汇定义描述:

stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "R" | "U" | "f" | "F"
                     | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | stringescapeseq
longstringitem  ::=  longstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
stringescapeseq ::=  "\" <any source character>
bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix    ::=  "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes     ::=  "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes      ::=  "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::=  shortbyteschar | bytesescapeseq
longbytesitem  ::=  longbyteschar | bytesescapeseq
shortbyteschar ::=  <any ASCII character except "\" or newline or the quote>
longbyteschar  ::=  <any ASCII character except "\">
bytesescapeseq ::=  "\" <any ASCII character>

这些结果未指出的一个语法限制是,在 stringprefixbytesprefix 以及文字的其余部分。源字符集由编码声明定义;如果源文件中没有给定编码声明,则为UTF-8;请参见第节 编码声明 .

纯英语:两种文字都可以用匹配的单引号括起来。 (' )或双引号 (" )它们也可以用三个单引号或双引号(通常称为 triple-quoted strings )反斜线 (\ )字符用于转义其他具有特殊含义的字符,如换行符、反斜杠本身或引号字符。

字节文本总是以 'b''B' ;它们生成 bytes 键入而不是 str 类型。它们只能包含ASCII字符;数值为128或更大的字节必须用转义符表示。

字符串和字节文本都可以选择以字母作为前缀 'r''R' ;这样的字符串被调用 raw strings 并将反斜杠视为文字字符。因此,在字符串文本中, '\U''\u' 原始字符串中的转义不进行特殊处理。假设python 2.x的原始unicode文本与python 3.x的行为不同,那么 'ur' 不支持语法。

3.3 新版功能: 这个 'rb' 已将原始字节文本的前缀添加为 'br' .

3.3 新版功能: 对Unicode旧文本的支持 (u'value' )重新引入以简化双python 2.x和3.x代码库的维护。见 PEP 414 更多信息。

字符串文字 'f''F' 在其前缀中是 formatted string literal格式化字符串文本 . 这个 'f' 可与 'r' ,但不是 'b''u' 因此,原始格式化字符串是可能的,但格式化字节文本不是。

在三重引用的文本中,允许使用(并保留)无换行符和引号,但一行中的三个无换行符终止了文本。(引号是用来打开文字的字符,即 '"

除非一个 'r''R' 存在前缀,字符串和字节文本中的转义序列根据类似于标准C使用的规则进行解释。识别的转义序列为:

转义序列

意义

笔记

\newline

忽略反斜杠和换行符

\\

反斜线 (\

\'

单引号 ('

\"

双引号 ("

\a

ASCII铃(BEL)

\b

ASCII退格(bs)

\f

ASCII格式源(FF)

\n

ASCII换行符(LF)

\r

ASCII回车(CR)

\t

ASCII水平制表符(制表符)

\v

ASCII垂直制表符(VT)

\ooo

八进制值字符 ooo

(1,3)

\xhh

十六进制值字符 hh

(2,3)

仅在字符串文本中识别的转义序列是:

转义序列

意义

笔记

\N{name}

字符命名 name 在Unicode数据库中

(4)

\uxxxx

16位十六进制值字符 xxxx

(5)

\Uxxxxxxxx

带32位十六进制值的字符 XXXXXXXX

(6)

笔记:

  1. 与标准C一样,最多可接受三个八进制数字。

  2. 与标准C不同,只需要两个十六进制数字。

  3. 在字节文字中,十六进制和八进制转义表示具有给定值的字节。在字符串文字中,这些转义表示具有给定值的Unicode字符。

  4. 在 3.3 版更改: 支持名称别名 1 已被添加。

  5. 正好需要四个十六进制数字。

  6. 任何Unicode字符都可以这样编码。需要八个十六进制数字。

与标准C不同,所有无法识别的转义序列都保持在字符串中不变,即, 反斜杠留在结果中 . (此行为在调试时很有用:如果转义序列类型错误,则结果输出更容易被识别为中断。)还必须注意,仅在字符串文本中识别的转义序列属于字节文本的无法识别转义的类别。

在 3.6 版更改: 无法识别的转义序列产生 DeprecationWarning . 在未来的Python版本中,它们将是 SyntaxWarning 最终 SyntaxError .

即使在原始文本中,引号也可以用反斜杠转义,但反斜杠仍保留在结果中;例如, r"\"" 是由两个字符组成的有效字符串文本:反斜杠和双引号; r"\" 不是有效的字符串文本(即使原始字符串也不能以奇数个反斜杠结尾)。明确地, 原始文本不能以单个反斜杠结尾 (因为反斜杠将转义以下引号字符)。还要注意,后面跟一个换行符的反斜杠被解释为这两个字符是文字的一部分, not 作为一行继续。

2.4.2. 串字面值的连接

允许使用多个相邻的字符串或字节文本(用空格分隔),可能使用不同的引用约定,它们的含义与它们的连接相同。因此, "hello" 'world' 等于 "helloworld" . 此功能可用于减少所需的反斜杠数量,方便地将长字符串拆分为多行,甚至可以向字符串的某些部分添加注释,例如:

re.compile("[A-Za-z_]"       # letter or underscore
           "[A-Za-z0-9_]*"   # letter, digit or underscore
          )

注意,这个特性是在语法级别定义的,但在编译时实现的。“+”运算符必须用于在运行时连接字符串表达式。还要注意,文本连接可以为每个组件使用不同的引用样式(甚至混合原始字符串和三重引号字符串),格式化字符串文本可以与普通字符串文本连接。

2.4.3. 格式化字符串文本

3.6 新版功能.

A formatted string literalf-string 是前缀为的字符串文本 'f''F' . 这些字符串可能包含替换字段,替换字段是由大括号分隔的表达式。 {{}} . 虽然其他字符串文本总是有一个常量值,但格式化字符串实际上是在运行timeit算的表达式。

转义序列像普通字符串文本一样被解码(除非文本也被标记为原始字符串)。解码后,字符串内容的语法为:

f_string          ::=  (literal_char | "{{" | "}}" | replacement_field)*
replacement_field ::=  "{" f_expression ["="] ["!" conversion] [":" format_spec] "}"
f_expression      ::=  (conditional_expression | "*" or_expr)
                         ("," conditional_expression | "," "*" or_expr)* [","]
                       | yield_expression
conversion        ::=  "s" | "r" | "a"
format_spec       ::=  (literal_char | NULL | replacement_field)*
literal_char      ::=  <any code point except "{", "}" or NULL>

大括号外的字符串部分按字面意思处理,除了任何双大括号 '{{{{''}}}}' 替换为相应的单大括号。单开方括号 '{{' 标记以Python表达式开头的替换字段。若要在计算后同时显示表达式文本及其值(在调试中很有用),请使用等号 '=' 可以在表达式后面添加。由感叹号引入的转换字段 '!' 可能会接踵而至。格式说明符也可以附加,用冒号引入 ':' . 替换字段以右大括号结尾 '}}' .

格式化字符串文本中的表达式被视为用括号括起来的正则python表达式,但有一些例外。不允许空表达式,并且两者都允许 lambda 和赋值表达式 := 必须用明确的括号括起来。替换表达式可以包含换行符(例如在三引号字符串中),但不能包含注释。每个表达式在格式化字符串文本出现的上下文中按从左到右的顺序进行计算。

在 3.7 版更改: 在Python3.7之前 await 包含 async for 子句在格式化字符串文本的表达式中是非法的,因为实现有问题。

当等号 '=' 则输出将具有表达式文本 '=' 以及评估值。左大括号后的空格 '{{' 在表达式中,在表达式之后 '=' 都保留在输出中。默认情况下 '=' 导致 repr() 提供的表达式,除非指定了格式。指定格式时,默认为 str() 除非转换 '!r' 已声明。

3.8 新版功能: 等号 '=' .

如果指定了转换,则在格式化之前转换表达式的计算结果。转换 '!s' 调用 str() 关于结果, '!r' 调用 repr()'!a' 调用 ascii() .

然后使用 format() 协议。将格式说明符传递给 __format__() 表达式或转换结果的方法。省略格式说明符时传递空字符串。格式化后的结果将包含在整个字符串的最终值中。

顶级格式说明符可以包括嵌套替换字段。这些嵌套字段可能包括它们自己的转换字段和 format specifiers ,但可能不包括嵌套更深的替换字段。这个 format specifier mini-languagestr.format() 方法。

格式化字符串文本可以连接,但替换字段不能跨文本拆分。

格式化字符串文本的一些示例:

>>> name = "Fred"
>>> f"He said his name is {name!r}."
"He said his name is 'Fred'."
>>> f"He said his name is {repr(name)}."  # repr() is equivalent to !r
"He said his name is 'Fred'."
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # nested fields
'result:      12.35'
>>> today = datetime(year=2017, month=1, day=27)
>>> f"{today:%B %d, %Y}"  # using date format specifier
'January 27, 2017'
>>> f"{today=:%B %d, %Y}" # using date format specifier and debugging
'today=January 27, 2017'
>>> number = 1024
>>> f"{number:#0x}"  # using integer format specifier
'0x400'
>>> foo = "bar"
>>> f"{ foo = }" # preserves whitespace
" foo = 'bar'"
>>> line = "The mill's closed"
>>> f"{line = }"
'line = "The mill\'s closed"'
>>> f"{line = :20}"
"line = The mill's closed   "
>>> f"{line = !r:20}"
'line = "The mill\'s closed" '

与常规字符串文本共享相同语法的结果是替换字段中的字符不能与外部格式化字符串文本中使用的引号冲突::

f"abc {a["x"]} def"    # error: outer string literal ended prematurely
f"abc {a['x']} def"    # workaround: use different quoting

格式表达式中不允许使用反斜杠,并将引发错误::

f"newline: {ord('\n')}"  # raises SyntaxError

要包含需要反斜杠转义的值,请创建一个临时变量。

>>> newline = ord('\n')
>>> f"newline: {newline}"
'newline: 10'

格式化字符串文本不能用作docstring,即使它们不包括表达式。

>>> def foo():
...     f"Not a docstring"
...
>>> foo.__doc__ is None
True

也见 PEP 498 用于添加格式化字符串文本的建议,以及 str.format() ,它使用相关的格式字符串机制。

2.4.4. 数值型的字面值

数字文本有三种类型:整数、浮点数和虚数。没有复杂的文字(通过添加实数和虚数可以形成复数)。

请注意,数字文本不包括符号;类似短语 -1 实际上是由一元运算符“-`”和文本组成的表达式 1 .

2.4.5. 整数字面值

整型文字由以下词汇定义描述:

integer      ::=  decinteger | bininteger | octinteger | hexinteger
decinteger   ::=  nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*
bininteger   ::=  "0" ("b" | "B") (["_"] bindigit)+
octinteger   ::=  "0" ("o" | "O") (["_"] octdigit)+
hexinteger   ::=  "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit ::=  "1"..."9"
digit        ::=  "0"..."9"
bindigit     ::=  "0" | "1"
octdigit     ::=  "0"..."7"
hexdigit     ::=  digit | "a"..."f" | "A"..."F"

除了可以存储在可用内存中的内容外,整型文本的长度没有限制。

在确定文本的数值时忽略下划线。它们可用于对数字进行分组,以增强可读性。一个下划线可以出现在数字之间,也可以出现在基本说明符之后,如 0x .

请注意,不允许使用非零十进制数中的前导零。这是为了使用C样式的八进制文字来消除歧义,而Python在3.0版本之前使用了这种文字。

整数文本的一些示例:

7     2147483647                        0o177    0b100110111
3     79228162514264337593543950336     0o377    0xdeadbeef
      100_000_000_000                   0b_1110_0101

在 3.6 版更改: 现在允许下划线用于文本中的分组目的。

2.4.6. 浮点型的字面值

浮点文字由以下词汇定义描述:

floatnumber   ::=  pointfloat | exponentfloat
pointfloat    ::=  [digitpart] fraction | digitpart "."
exponentfloat ::=  (digitpart | pointfloat) exponent
digitpart     ::=  digit (["_"] digit)*
fraction      ::=  "." digitpart
exponent      ::=  ("e" | "E") ["+" | "-"] digitpart

请注意,整数和指数部分总是用基数10来解释。例如, 077e010 是合法的,并表示与 77e10 . 允许的浮点文本范围取决于实现。与整型文字一样,数字分组支持下划线。

浮点文本的一些示例:

3.14    10.    .001    1e100    3.14e-10    0e0    3.14_15_93

在 3.6 版更改: 现在允许下划线用于文本中的分组目的。

2.4.7. 虚数的字面值

虚拟文字由以下词汇定义描述:

imagnumber ::=  (floatnumber | digitpart) ("j" | "J")

虚文字产生实数部分为0.0的复数。复数表示为一对浮点数,对其范围有相同的限制。要创建具有非零实数部分的复数,请向其添加浮点数,例如, (3+4j) . 假想文字的一些例子:

3.14j   10.j    10j     .001j   1e100j   3.14e-10j   3.14_15_93j

2.5. 算子

以下标记是运算符:

+       -       *       **      /       //      %      @
<<      >>      &       |       ^       ~       :=
<       >       <=      >=      ==      !=

2.6. 分隔符

以下标记在语法中用作分隔符:

(       )       [       ]       {       }
,       :       .       ;       @       =       ->
+=      -=      *=      /=      //=     %=      @=
&=      |=      ^=      >>=     <<=     **=

周期也可以出现在浮点和虚文字中。三个句点的序列作为省略号文本有着特殊的意义。列表的后半部分(增广的赋值操作符)在词汇上充当定界符,但也执行操作。

以下打印ASCII字符作为其他标记的一部分具有特殊含义,或者对词汇分析器具有其他重要意义:

'       "       #       \

以下打印ASCII字符未在Python中使用。它们出现在字符串文本和注释之外是一个无条件错误:

$       ?       `

脚注

1

https://www.unicode.org/Public/11.0.0/ucd/NameAliases.txt