lexical_analysis.md
1> **Источник:** https://python-all.ru/3.4/reference/lexical_analysis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 2. Лексический анализ89Программа на Python читается *парсером*. На вход парсера подаётся поток\\n*токенов*, генерируемый *лексическим анализатором*. В этой главе описывается, как\\nлексический анализатор разбивает файл на токены.1011Python читает текст программы как кодовые точки Unicode; кодировка исходного файла может быть задана объявлением кодировки и по умолчанию равна UTF-8, подробнее см. [**PEP 3120**](https://python-all.ru/3.4/reference/lexical_analysis.html). Если исходный файл не удаётся декодировать, вызывается [`SyntaxError`](https://python-all.ru/3.4/library/exceptions.html#SyntaxError).1213## 2.1. Структура строк1415Программа на Python состоит из нескольких *логических строк*.1617### 2.1.1. Логические строки1819Конец логической строки обозначается токеном NEWLINE. Инструкции не могут пересекать границы логических строк, за исключением случаев, когда NEWLINE допускается синтаксисом (например, между инструкциями в составных инструкциях). Логическая строка строится из одной или нескольких *физических строк* путём следования правилам явного или неявного *объединения строк*.2021### 2.1.2. Физические строки2223Физическая строка – это последовательность символов, завершающаяся последовательностью конца строки. В исходных файлах можно использовать любую из стандартных для платформы последовательностей конца строки: в стиле Unix – ASCII LF (перевод строки), в Windows – последовательность ASCII CR LF (возврат каретки с переводом строки) или в старом стиле Macintosh – символ ASCII CR (возврат каретки). Все эти формы равноправны и могут использоваться независимо от платформы.2425При встраивании Python строки исходного кода следует передавать в Python API, используя стандартные соглашения C для символов новой строки (символ `\n`, представляющий ASCII LF, является терминатором строки).2627### 2.1.3. Комментарии2829Комментарий начинается с символа решётки (`#`), не входящего в строковый литерал, и заканчивается в конце физической строки. Комментарий означает конец логической строки, если только не применяются правила неявного объединения строк. Синтаксис игнорирует комментарии; они не являются токенами.3031### 2.1.4. Объявления кодировки3233Если комментарий в первой или второй строке сценария Python соответствует регулярному выражению `coding[=:]\s*([-\w.]+)`, такой комментарий обрабатывается как объявление кодировки; первая группа этого выражения указывает кодировку файла исходного кода. Объявление кодировки должно располагаться на отдельной строке. Если оно находится на второй строке, первая строка также должна содержать только комментарий. Рекомендуемые формы выражения кодировки:3435```python36# -*- coding: <encoding-name> -*-37```3839которая распознаётся также GNU Emacs, и4041```python42# vim:fileencoding=<encoding-name>43```4445которая распознаётся VIM от Брама Муленаара.4647Если объявление кодировки не найдено, кодировкой по умолчанию является UTF-8. Кроме того, если первые байты файла представляют собой маркер последовательности байтов UTF-8 (`b'\xef\xbb\xbf'`), объявленная кодировка файла – UTF-8 (это поддерживается, в частности, **Блокнотом** Microsoft).4849Если объявлена кодировка, её имя должно распознаваться Python. Эта кодировка используется для всего лексического анализа, включая строковые литералы, комментарии и идентификаторы.5051### 2.1.5. Явное объединение строк5253Две или более физические строки могут быть объединены в логические строки с помощью символа обратной косой черты (`\`) следующим образом: если физическая строка заканчивается обратной косой чертой, которая не является частью строкового литерала или комментария, она объединяется со следующей строкой, образуя одну логическую строку; при этом обратная косая черта и следующий за ней символ конца строки удаляются. Например:5455```python56if 1900 < year < 2100 and 1 <= month <= 12 \57 and 1 <= day <= 31 and 0 <= hour < 24 \58 and 0 <= minute < 60 and 0 <= second < 60: # Похоже на корректную дату59 return 160```6162Строка, заканчивающаяся обратной косой чертой, не может содержать комментарий. Обратная косая черта не продолжает комментарий. Обратная косая черта не продолжает токен, за исключением строковых литералов (т.е. токены, отличные от строковых литералов, нельзя разделять между физическими строками с помощью обратной косой черты). Обратная косая черта недопустима в других местах строки вне строкового литерала.6364### 2.1.6. Неявное объединение строк6566Выражения в круглых, квадратных или фигурных скобках можно разбивать на несколько физических строк без использования обратной косой черты. Например:6768```python69month_names = ['Januari', 'Februari', 'Maart', # Это70 'April', 'Mei', 'Juni', # голландские названия71 'Juli', 'Augustus', 'September', # для месяцев72 'Oktober', 'November', 'December'] # года73```7475Неявно продолжаемые строки могут содержать комментарии. Отступ строк продолжения не важен. Допускаются пустые строки продолжения. Между неявно продолжаемыми строками не генерируется токен NEWLINE. Неявно продолжаемые строки также могут встречаться внутри строк в тройных кавычках (см. ниже); в этом случае они не могут содержать комментарии.7677### 2.1.7. Пустые строки7879Логическая строка, содержащая только пробелы, табуляции, символы перевода страницы и, возможно, комментарий, игнорируется (т. е. токен NEWLINE не генерируется). Во время интерактивного ввода инструкций обработка пустой строки может различаться в зависимости от реализации цикла чтения-вычисления-печати. В стандартном интерактивном интерпретаторе полностью пустая логическая строка (т. е. не содержащая даже пробельных символов или комментария) завершает многострочную инструкцию.8081### 2.1.8. Отступы8283Начальные пробельные символы (пробелы и табуляции) в начале логической строки используются для вычисления уровня отступа строки, который, в свою очередь, используется для определения группировки инструкций.8485Символы табуляции заменяются (слева направо) на от одного до восьми пробелов так, чтобы общее количество символов до и включая замену было кратно восьми (это то же правило, что используется в Unix). Общее количество пробелов перед первым непробельным символом затем определяет отступ строки. Отступ нельзя разделить на несколько физических строк с помощью обратной косой черты; пробельные символы до первой обратной косой черты определяют отступ.8687Отступ считается недопустимым, если исходный файл смешивает табуляцию и пробелы таким образом, что смысл зависит от размера табуляции в пробелах; в этом случае вызывается [`TabError`](https://python-all.ru/3.4/library/exceptions.html#TabError).8889**Примечание о кроссплатформенной совместимости:** из-за особенностей текстовых редакторов на платформах, отличных от UNIX, не рекомендуется использовать смесь пробелов и табуляции для отступов в одном исходном файле. Также следует отметить, что разные платформы могут явно ограничивать максимальный уровень отступа.9091Символ перевода страницы может присутствовать в начале строки; он будет игнорироваться при вычислении отступа, описанном выше. Символы перевода страницы, встречающиеся в других местах начальных пробельных символов, имеют неопределённый эффект (например, они могут сбросить счётчик пробелов до нуля).9293Уровни отступа последовательных строк используются для генерации токенов INDENT и DEDENT, применяя стек, следующим образом.9495Before the first line of the file is read, a single zero is pushed on the stack; this will never be popped off again. The numbers pushed on the stack will always be strictly increasing from bottom to top. At the beginning of each logical line, the line’s indentation level is compared to the top of the stack. If it is equal, nothing happens. If it is larger, it is pushed on the stack, and one INDENT token is generated. If it is smaller, it *must* be one of the numbers occurring on the stack; all numbers on the stack that are larger are popped off, and for each number popped off a DEDENT token is generated. At the end of the file, a DEDENT token is generated for each number remaining on the stack that is larger than zero.9697Вот пример корректно (хотя и запутанно) оформленного отступами фрагмента кода Python:9899```python100def perm(l):101 # Вычислить список всех перестановок l102 if len(l) <= 1:103 return [l]104 r = []105 for i in range(len(l)):106 s = l[:i] + l[i+1:]107 p = perm(s)108 for x in p:109 r.append(l[i:i+1] + x)110 return r111```112113Следующий пример показывает различные ошибки отступов:114115```python116 def perm(l): # ошибка: первая строка с отступом117for i in range(len(l)): # ошибка: нет отступа118 s = l[:i] + l[i+1:]119 p = perm(l[:i] + l[i+1:]) # ошибка: неожиданный отступ120 for x in p:121 r.append(l[i:i+1] + x)122 return r # ошибка: несоответствие отступа123```124125(На самом деле первые три ошибки обнаруживаются синтаксическим анализатором; только последняя ошибка находится лексическим анализатором – отступ `return r` не соответствует уровню, извлечённому из стека.)126127### 2.1.9. Пробелы между токенами128129За исключением начала логической строки или строковых литералов, пробельные символы (пробел, табуляция, перевод страницы) могут использоваться взаимозаменяемо для разделения токенов. Пробел требуется между двумя токенами только в том случае, если их объединение может быть интерпретировано как другой токен (например, ab – один токен, а a b – два токена).130131## 2.2. Другие токены132133Besides NEWLINE, INDENT and DEDENT, the following categories of tokens exist: *identifiers*, *keywords*, *literals*, *operators*, and *delimiters*. Whitespace characters (other than line terminators, discussed earlier) are not tokens, but serve to delimit tokens. Where ambiguity exists, a token comprises the longest possible string that forms a legal token, when read from left to right.134135## 2.3. Идентификаторы и ключевые слова136137Identifiers (also referred to as *names*) are described by the following lexical definitions.138139The syntax of identifiers in Python is based on the Unicode standard annex UAX-31, with elaboration and changes as defined below; see also [**PEP 3131**](https://python-all.ru/3.4/reference/lexical_analysis.html) for further details.140141В диапазоне ASCII (U+0001..U+007F) допустимые символы для идентификаторов такие же, как в Python 2.x: прописные и строчные буквы от `A` до `Z`, символ подчёркивания `_` и, за исключением первого символа, цифры от `0` до `9`.142143Python 3.0 вводит дополнительные символы за пределами диапазона ASCII (см. [**PEP 3131**](https://python-all.ru/3.4/reference/lexical_analysis.html)). Для этих символов классификация использует версию Unicode Character Database, входящую в модуль [`unicodedata`](https://python-all.ru/3.4/library/unicodedata.html#module-unicodedata).144145Идентификаторы не имеют ограничения по длине. Регистр имеет значение.146147```148149identifier ::= xid_start xid_continue*150id_start ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>151id_continue ::= <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>152xid_start ::= <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">153xid_continue ::= <all characters in id_continue whose NFKC normalization is in "id_continue*">154```155156Упомянутые выше коды категорий Unicode означают:157158- *Lu* - uppercase letters159- *Ll* - lowercase letters160- *Lt* - titlecase letters161- *Lm* - modifier letters162- *Lo* - other letters163- *Nl* - letter numbers164- *Mn* - nonspacing marks165- *Mc* - spacing combining marks166- *Nd* - decimal numbers167- *Pc* - connector punctuations168- *Other\_ID\_Start* - explicit list of characters in [PropList.txt](https://python-all.ru/3.4/reference/lexical_analysis.html) to support backwards compatibility169- *Other\_ID\_Continue* - likewise170171Все идентификаторы при разборе преобразуются в нормальную форму NFKC; сравнение идентификаторов основано на NFKC.172173Неформальный HTML-файл со списком всех допустимых символов идентификаторов для Unicode 4.1 можно найти по адресу [http://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html](https://python-all.ru/3.4/reference/lexical_analysis.html).174175### 2.3.1. Ключевые слова176177The following identifiers are used as reserved words, or *keywords* of the language, and cannot be used as ordinary identifiers. They must be spelled exactly as written here:178179```text180False class finally is return181None continue for lambda try182True def from nonlocal while183and del global not with184as elif if or yield185assert else import pass186break except in raise187```188189### 2.3.2. Зарезервированные классы идентификаторов190191Некоторые классы идентификаторов (помимо ключевых слов) имеют специальное значение. Эти классы определяются по шаблонам ведущих и завершающих символов подчёркивания:192193**`_*`**194195Не импортируется `from module import *`. Специальный идентификатор `_` используется в интерактивном интерпретаторе для хранения результата последнего вычисления; он хранится в модуле [`builtins`](https://python-all.ru/3.4/library/builtins.html#module-builtins). Когда интерактивный режим не активен, `_` не имеет специального значения и не определён. См. раздел [*Инструкция import*](https://python-all.ru/3.4/reference/simple_stmts.html#import).196197> **Примечание**198>199> Имя `_` часто используется в связи с интернационализацией; обратитесь к документации модуля [`gettext`](https://python-all.ru/3.4/library/gettext.html#module-gettext) для получения дополнительной информации об этом соглашении.200201**`__*__`**202203Системные имена. Эти имена определяются интерпретатором и его реализацией (включая стандартную библиотеку). Текущие системные имена обсуждаются в разделе204205[*Специальные имена методов*](https://python-all.ru/3.4/reference/datamodel.html#specialnames)206207и в других местах. В будущих версиях Python, скорее всего, появится больше таких имён.208209*Любое*210211использование имён212213`__*__`214215, в любом контексте, не соответствующее явно задокументированному назначению, может быть нарушено без предупреждения.216217**`__*`**218219Приватные имена классов. Имена этой категории при использовании в контексте определения класса переписываются в искажённую форму, чтобы избежать конфликтов имён между «приватными» атрибутами базовых и производных классов. См. раздел220221[*Идентификаторы (имена)*](https://python-all.ru/3.4/reference/expressions.html#atom-identifiers)222223.224225## 2.4. Литералы226227Литералы – это обозначения константных значений некоторых встроенных типов.228229### 2.4.1. Строковые литералы и литералы байтов230231Строковые литералы описываются следующими лексическими определениями:232233```234235stringliteral ::= [stringprefix](shortstring | longstring)236stringprefix ::= "r" | "u" | "R" | "U"237shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'238longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""'239shortstringitem ::= shortstringchar | stringescapeseq240longstringitem ::= longstringchar | stringescapeseq241shortstringchar ::= <any source character except "\" or newline or the quote>242longstringchar ::= <any source character except "\">243stringescapeseq ::= "\" <any source character>244```245246```247248bytesliteral ::= bytesprefix(shortbytes | longbytes)249bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"250shortbytes ::= "'" shortbytesitem* "'" | '"' shortbytesitem* '"'251longbytes ::= "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'252shortbytesitem ::= shortbyteschar | bytesescapeseq253longbytesitem ::= longbyteschar | bytesescapeseq254shortbyteschar ::= <any ASCII character except "\" or newline or the quote>255longbyteschar ::= <any ASCII character except "\">256bytesescapeseq ::= "\" <any ASCII character>257```258259Одно синтаксическое ограничение, не указанное в этих правилах, заключается в том, что пробелы не допускаются между [`stringprefix`](https://python-all.ru/3.4/reference/lexical_analysis.html#grammar-token-stringprefix) или [`bytesprefix`](https://python-all.ru/3.4/reference/lexical_analysis.html#grammar-token-bytesprefix) и остальной частью литерала. Набор символов источника определяется объявлением кодировки; по умолчанию UTF-8, если объявление кодировки не задано в исходном файле; см. раздел [*Объявления кодировки*](https://python-all.ru/3.4/reference/lexical_analysis.html#encodings).260261Простыми словами: оба типа литералов могут быть заключены в парные одинарные кавычки (`'`) или двойные кавычки (`"`). Они также могут быть заключены в парные группы из трёх одинарных или двойных кавычек (обычно называются *строками в тройных кавычках*). Символ обратной косой черты (`\`) используется для экранирования символов, которые в противном случае имеют специальное значение, таких как новая строка, сама обратная косая черта или символ кавычки.262263Литералы байтов всегда имеют префикс `'b'` или `'B'`; они создают экземпляр типа [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) вместо типа [`str`](https://python-all.ru/3.4/library/stdtypes.html#str). Они могут содержать только ASCII-символы; байты со значением 128 или больше должны быть выражены с помощью escape-последовательностей.264265Начиная с Python 3.3 снова стало возможным добавлять к строковым литералам префикс `u` для упрощения поддержки кодовых баз, совместимых одновременно с 2.x и 3.x.266267Как строковые, так и байтовые литералы могут по желанию иметь префикс `'r'` или `'R'`; такие строки называются *сырыми строками* и обрабатывают обратную косую черту как обычный символ. В результате в строковых литералах escape-последовательности `'\U'` и `'\u'` в сырых строках не обрабатываются особым образом. Учитывая, что сырые строки Unicode в Python 2.x ведут себя иначе, чем в Python 3.x, синтаксис `'ur'` не поддерживается.268269Новое в версии 3.3: Префикс `'rb'` у сырых байтовых литералов был добавлен как синоним `'br'`.270271Новое в версии 3.3: Поддержка устаревшего литерала Unicode (`u'value'`) была вновь введена для упрощения поддержки кодовых баз, совместимых с Python 2.x и 3.x. См. [**PEP 414**](https://python-all.ru/3.4/reference/lexical_analysis.html) для получения дополнительной информации.272273В литералах в тройных кавычках разрешены неэкранированные символы новой строки и кавычки (и они сохраняются), за исключением того, что три неэкранированные кавычки подряд завершают литерал. («Кавычка» – это символ, используемый для открытия литерала, т.е. либо `'`, либо `"`.)274275Если префикс `'r'` или `'R'` отсутствует, escape-последовательности в строковых и байтовых литералах интерпретируются по правилам, аналогичным используемым в Standard C. Распознаваемые escape-последовательности:276277| Escape-последовательность | Значение | Примечания |278| --- | --- | --- |279| `\newline` | Обратная косая черта и новая строка игнорируются | |280| `\\` | Обратная косая черта (`\`) | |281| `\'` | Одинарная кавычка (`'`) | |282| `\"` | Двойная кавычка (`"`) | |283| `\a` | ASCII Звонок (BEL) | |284| `\b` | ASCII Забой (BS) | |285| `\f` | ASCII Перевод страницы (FF) | |286| `\n` | ASCII Перевод строки (LF) | |287| `\r` | ASCII Возврат каретки (CR) | |288| `\t` | ASCII горизонтальная табуляция (TAB) | |289| `\v` | ASCII вертикальная табуляция (VT) | |290| `\ooo` | Символ с восьмеричным значением *ooo* | (1,3) |291| `\xhh` | Символ с шестнадцатеричным значением *hh* | (2,3) |292293Управляющие последовательности, распознаваемые только в строковых литералах:294295| Escape-последовательность | Значение | Примечания |296| --- | --- | --- |297| `\N{name}` | Символ с именем *name* в базе данных Unicode | (4) |298| `\uxxxx` | Символ с 16-битным шестнадцатеричным значением *xxxx* | (5) |299| `\Uxxxxxxxx` | Символ с 32-битным шестнадцатеричным значением *xxxxxxxx* | (6) |300301Примечания:3023031. Как и в стандарте C, допускается до трёх восьмеричных цифр.3042. В отличие от стандартного C, требуется ровно две шестнадцатеричные цифры.3053. В байтовом литерале шестнадцатеричные и восьмеричные управляющие последовательности обозначают байт с заданным значением. В строковом литерале эти управляющие последовательности обозначают символ Unicode с заданным значением.3064. Изменено в версии 3.3: Добавлена поддержка псевдонимов имён [\[1\]](https://python-all.ru/3.4/reference/lexical_analysis.html#id13).3075. Отдельные кодовые единицы, составляющие части суррогатной пары, могут быть закодированы с помощью этой управляющей последовательности. Требуются ровно четыре шестнадцатеричных цифры.3086. Любой символ Unicode может быть закодирован таким образом. Требуется ровно восемь шестнадцатеричных цифр.309310В отличие от стандарта C, все нераспознанные управляющие последовательности остаются в строке без изменений, т.е. *обратная косая черта сохраняется в результате*. (Это поведение полезно при отладке: если управляющая последовательность введена с ошибкой, полученный результат легче распознать как сломанный.) Также важно отметить, что управляющие последовательности, распознаваемые только в строковых литералах, попадают в категорию нераспознанных управляющих последовательностей для байтовых литералов.311312Даже в сыром литерале кавычки можно экранировать обратной косой чертой, но обратная косая черта остается в результате; например, `r"\""` – это допустимый строковый литерал, состоящий из двух символов: обратной косой черты и двойной кавычки; `r"\"` не является допустимым строковым литералом (даже сырая строка не может заканчиваться нечетным количеством обратных косых черт). В частности, *сырой литерал не может заканчиваться одной обратной косой чертой* (так как обратная косая черта экранировала бы следующий символ кавычки). Также обратите внимание, что одна обратная косая черта, за которой следует перевод строки, интерпретируется как эти два символа в составе литерала, *а не* как продолжение строки.313314### 2.4.2. Конкатенация строковых литералов315316Допускается использование нескольких смежных строковых литералов или литералов байтов (разделенных пробелами), возможно с разными соглашениями о кавычках, и их значение равно их конкатенации. Таким образом, `"hello" 'world'` эквивалентно `"helloworld"`. Эта возможность может использоваться для уменьшения количества необходимых обратных косых черт, для удобного разделения длинных строк на несколько строк или даже для добавления комментариев к частям строк, например:317318```python319re.compile("[A-Za-z_]" # буква или подчёркивание320 "[A-Za-z0-9_]*" # буква, цифра или подчёркивание321 )322```323324Обратите внимание, что эта возможность определяется на синтаксическом уровне, но реализуется на этапе компиляции. Оператор '+' должен использоваться для конкатенации строковых выражений во время выполнения. Также обратите внимание, что при конкатенации литералов для каждого компонента можно использовать разные стили кавычек (в том числе смешивать сырые строки и строки в тройных кавычках).325326### 2.4.3. Числовые литералы327328Существует три типа числовых литералов: целые числа, числа с плавающей запятой и мнимые числа. Комплексных литералов нет (комплексные числа можно получить сложением действительного и мнимого чисел).329330Обратите внимание, что числовые литералы не включают знак; конструкция вида `-1` на самом деле является выражением, состоящим из унарного оператора ‘`-`‘ и литерала `1`.331332### 2.4.4. Целочисленные литералы333334Целочисленные литералы описываются следующими лексическими определениями:335336```337338integer ::= decimalinteger | octinteger | hexinteger | bininteger339decimalinteger ::= nonzerodigit digit* | "0"+340nonzerodigit ::= "1"..."9"341digit ::= "0"..."9"342octinteger ::= "0" ("o" | "O") octdigit+343hexinteger ::= "0" ("x" | "X") hexdigit+344bininteger ::= "0" ("b" | "B") bindigit+345octdigit ::= "0"..."7"346hexdigit ::= digit | "a"..."f" | "A"..."F"347bindigit ::= "0" | "1"348```349350Не существует ограничения на длину целочисленных литералов, кроме того, что может быть сохранено в доступной памяти.351352Обратите внимание, что ведущие нули в ненулевом десятичном числе не допускаются. Это сделано для устранения неоднозначности с восьмеричными литералами в стиле C, которые Python использовал до версии 3.0.353354Некоторые примеры целочисленных литералов:355356```python3577 2147483647 0o177 0b1001101113583 79228162514264337593543950336 0o377 0xdeadbeef359```360361### 2.4.5. Литералы с плавающей точкой362363Литералы с плавающей запятой описываются следующими лексическими определениями:364365```366367floatnumber ::= pointfloat | exponentfloat368pointfloat ::= [intpart] fraction | intpart "."369exponentfloat ::= (intpart | pointfloat) exponent370intpart ::= digit+371fraction ::= "." digit+372exponent ::= ("e" | "E") ["+" | "-"] digit+373```374375Обратите внимание, что целая часть и часть порядка всегда интерпретируются с основанием 10. Например, `077e010` допустимо и обозначает то же число, что и `77e10`. Допустимый диапазон литералов с плавающей точкой зависит от реализации. Некоторые примеры литералов с плавающей точкой:376377```python3783.14 10. .001 1e100 3.14e-10 0e0379```380381Обратите внимание, что числовые литералы не включают знак; конструкция вида `-1` на самом деле является выражением, состоящим из унарного оператора `-` и литерала `1`.382383### 2.4.6. Мнимые литералы384385Мнимые литералы описываются следующими лексическими определениями:386387```388389imagnumber ::= (floatnumber | intpart) ("j" | "J")390```391392Литерал мнимого числа дает комплексное число с действительной частью 0.0. Комплексные числа представляются в виде пары чисел с плавающей точкой и имеют те же ограничения на диапазон. Чтобы создать комплексное число с ненулевой действительной частью, добавьте к нему число с плавающей точкой, например, `(3+4j)`. Некоторые примеры литералов мнимых чисел:393394```python3953.14j 10.j 10j .001j 1e100j 3.14e-10j396```397398## 2.5. Операторы399400Следующие токены являются операторами:401402```python403+ - * ** / // %404<< >> & | ^ ~405< > <= >= == !=406```407408## 2.6. Разделители409410Следующие токены служат разделителями в грамматике:411412```python413( ) [ ] { }414, : . ; @ = ->415+= -= *= /= //= %=416&= |= ^= >>= <<= **=417```418419Точка может также встречаться в литералах с плавающей точкой и мнимых литералах. Последовательность из трех точек имеет особое значение как литерал многоточия. Вторая половина списка – операторы присваивания с дополнением – лексически служат разделителями, но также выполняют операцию.420421Следующие печатные ASCII-символы имеют специальное значение как часть других токенов или иным образом значимы для лексического анализатора:422423```python424' " # \425```426427Следующие печатные ASCII-символы не используются в Python. Их появление вне строковых литералов и комментариев является безусловной ошибкой:428429```python430$ ? `431```432433Сноски434435| [\[1\]](https://python-all.ru/3.4/reference/lexical_analysis.html#id10) | [http://www.unicode.org/Public/6.3.0/ucd/NameAliases.txt](https://python-all.ru/3.4/reference/lexical_analysis.html) |436| --- | --- |437