lexical_analysis.md
1> **Источник:** https://python-all.ru/3.15/reference/lexical_analysis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 2. Лексический анализ89Программа на Python читается *синтаксическим анализатором*. На вход синтаксического анализатора подаётся поток [токенов](https://python-all.ru/3.15/glossary.html#term-token), генерируемых *лексическим анализатором* (также называемым *токенизатором*). В этой главе описывается, как лексический анализатор создаёт эти токены.1011Лексический анализатор определяет [кодировку](https://python-all.ru/3.15/reference/lexical_analysis.html#encodings) текста программы (по умолчанию UTF-8) и декодирует текст в [исходные символы](https://python-all.ru/3.15/reference/lexical_analysis.html#lexical-source-character). Если текст не удаётся декодировать, возбуждается исключение [`SyntaxError`](https://python-all.ru/3.15/library/exceptions.html#SyntaxError).1213Затем лексический анализатор использует исходные символы для генерации потока токенов. Тип генерируемого токена обычно зависит от следующего исходного символа, который должен быть обработан. Аналогично, другое специальное поведение анализатора зависит от первого исходного символа, который ещё не был обработан. В следующей таблице приведён краткий обзор этих исходных символов со ссылками на разделы, содержащие дополнительную информацию.1415| Символ | Следующий токен (или соответствующая документация) |16| --- | --- |17| пробел табуляция прогон страницы | [Пробельные символы](https://python-all.ru/3.15/reference/lexical_analysis.html#whitespace) |18| CR, LF | [Новая строка](https://python-all.ru/3.15/reference/lexical_analysis.html#line-structure) [Отступ](https://python-all.ru/3.15/reference/lexical_analysis.html#indentation) |19| обратная косая черта (`\`) | [Явное объединение строк](https://python-all.ru/3.15/reference/lexical_analysis.html#explicit-joining) (Также имеет значение в [escape-последовательностях строк](https://python-all.ru/3.15/reference/lexical_analysis.html#escape-sequences)) |20| знак решётки (`#`) | [Комментарий](https://python-all.ru/3.15/reference/lexical_analysis.html#comments) |21| кавычка (`'`, `"`) | [Строковый литерал](https://python-all.ru/3.15/reference/lexical_analysis.html#strings) |22| буква ASCII (`a`-`z`, `A`-`Z`) не ASCII-символ | [Имя](https://python-all.ru/3.15/reference/lexical_analysis.html#identifiers) [Строковый литерал или литерал bytes с префиксом](https://python-all.ru/3.15/reference/lexical_analysis.html#strings) |23| символ подчёркивания (`_`) | [Имя](https://python-all.ru/3.15/reference/lexical_analysis.html#identifiers) (Также может быть частью [числовых литералов](https://python-all.ru/3.15/reference/lexical_analysis.html#numbers)) |24| цифра (`0`-`9`) | [Числовой литерал](https://python-all.ru/3.15/reference/lexical_analysis.html#numbers) |25| точка (`.`) | [Числовой литерал](https://python-all.ru/3.15/reference/lexical_analysis.html#numbers) [Оператор](https://python-all.ru/3.15/reference/lexical_analysis.html#operators) |26| вопросительный знак (`?`) доллар (`$`) обратный апостроф (`` ` ``) управляющий символ | Ошибка (вне строковых литералов и комментариев) |27| другой печатный символ | [Оператор или разделитель](https://python-all.ru/3.15/reference/lexical_analysis.html#operators) |28| конец файла | [Маркер конца](https://python-all.ru/3.15/reference/lexical_analysis.html#endmarker-token) |2930## 2.1. Структура строки3132Программа на Python состоит из нескольких *логических строк*.3334### 2.1.1. Логические строки3536Конец логической строки обозначается токеном [`NEWLINE`](https://python-all.ru/3.15/library/token.html#token.NEWLINE). Инструкции не могут пересекать границы логических строк, кроме тех случаев, когда `NEWLINE` разрешено синтаксисом (например, между инструкциями в составных инструкциях). Логическая строка строится из одной или нескольких *физических строк* по правилам [явного](https://python-all.ru/3.15/reference/lexical_analysis.html#explicit-joining) или [неявного](https://python-all.ru/3.15/reference/lexical_analysis.html#implicit-joining) *объединения строк*.3738### 2.1.2. Физические строки3940Физическая строка – это последовательность символов, завершающаяся одной из следующих последовательностей конца строки:4142- форма Unix, использующая ASCII LF (перевод строки),43- форма Windows, использующая последовательность ASCII CR LF (возврат каретки, затем перевод строки),44- форма ‘[Classic Mac OS](https://python-all.ru/3.15/reference/lexical_analysis.html)’, использующая символ ASCII CR (возврат каретки).4546Независимо от платформы, каждая из этих последовательностей заменяется одним символом ASCII LF (перевод строки). (Это делается даже внутри [строковых литералов](https://python-all.ru/3.15/reference/lexical_analysis.html#strings).) В каждой строке может использоваться любая из этих последовательностей; они не обязаны быть согласованными в пределах одного файла.4748Конец входных данных также служит неявным терминатором для последней физической строки.4950Формально:5152```5354newline: <ASCII LF> | <ASCII CR> <ASCII LF> | <ASCII CR>55```5657### 2.1.3. Комментарии5859Комментарий начинается с символа решётки (`#`), не являющегося частью строкового литерала, и заканчивается в конце физической строки. Комментарий означает конец логической строки, если не применяются правила неявного объединения строк. Комментарии игнорируются синтаксисом.6061### 2.1.4. Объявления кодировки6263Если комментарий в первой или второй строке сценария Python соответствует регулярному выражению `coding[=:]\s*([-\w.]+)`, этот комментарий обрабатывается как объявление кодировки; первая группа этого выражения задаёт кодировку файла исходного кода. Объявление кодировки должно располагаться на отдельной строке. Если оно находится на второй строке, первая строка также должна содержать только комментарий. Рекомендуемые формы выражения кодировки:6465```python66# -*- coding: <encoding-name> -*-67```6869которая распознаётся также GNU Emacs, и7071```python72# vim:fileencoding=<encoding-name>73```7475которая распознаётся VIM от Брама Муленаара.7677Если объявление кодировки не найдено, используется кодировка UTF-8 по умолчанию. Если неявная или явная кодировка файла – UTF-8, начальная метка порядка байтов UTF-8 (`b'\xef\xbb\xbf'`) игнорируется, а не считается синтаксической ошибкой.7879Если кодировка объявлена, её имя должно распознаваться Python (см. [Стандартные кодировки](https://python-all.ru/3.15/library/codecs.html#standard-encodings)). Кодировка используется для всего лексического анализа, включая строковые литералы, комментарии и идентификаторы.8081Весь лексический анализ, включая строковые литералы, комментарии и идентификаторы, работает с текстом Unicode, декодированным с использованием исходной кодировки. Любая кодовая точка Unicode, кроме управляющего символа NUL, может встречаться в исходном коде Python.8283```8485source_character: <any Unicode code point, except NUL>86```8788### 2.1.5. Явное объединение строк8990Две или более физические строки могут быть объединены в логические строки с помощью символа обратной косой черты (`\`) следующим образом: если физическая строка заканчивается обратной косой чертой, которая не является частью строкового литерала или комментария, она объединяется со следующей строкой, образуя одну логическую строку; при этом обратная косая черта и следующий за ней символ конца строки удаляются. Например:9192```python93if 1900 < year < 2100 and 1 <= month <= 12 \94 and 1 <= day <= 31 and 0 <= hour < 24 \95 and 0 <= minute < 60 and 0 <= second < 60: # Похоже на корректную дату96 return 197```9899Строка, заканчивающаяся обратной косой чертой, не может содержать комментарий. Обратная косая черта не продолжает комментарий. Обратная косая черта не продолжает токен, за исключением строковых литералов (т.е. токены, отличные от строковых литералов, нельзя разделять между физическими строками с помощью обратной косой черты). Обратная косая черта недопустима в других местах строки вне строкового литерала.100101### 2.1.6. Неявное объединение строк102103Выражения в круглых, квадратных или фигурных скобках можно разбивать на несколько физических строк без использования обратной косой черты. Например:104105```python106month_names = ['Januari', 'Februari', 'Maart', # Это107 'April', 'Mei', 'Juni', # голландские названия108 'Juli', 'Augustus', 'September', # для месяцев109 'Oktober', 'November', 'December'] # года110```111112Неявно продолжаемые строки могут содержать комментарии. Отступ строк продолжения не важен. Допускаются пустые строки продолжения. Между неявно продолжаемыми строками не генерируется токен NEWLINE. Неявно продолжаемые строки также могут встречаться внутри строк в тройных кавычках (см. ниже); в этом случае они не могут содержать комментарии.113114### 2.1.7. Пустые строки115116Логическая строка, содержащая только пробелы, табуляции, символы перевода страницы и, возможно, комментарий, игнорируется (т.е. токен [`NEWLINE`](https://python-all.ru/3.15/library/token.html#token.NEWLINE) не генерируется). При интерактивном вводе инструкций обработка пустой строки может отличаться в зависимости от реализации цикла чтения-вычисления-вывода. В стандартном интерактивном интерпретаторе полностью пустая логическая строка (то есть строка, не содержащая даже пробелов или комментария) завершает многострочную инструкцию.117118### 2.1.8. Отступы119120Начальные пробельные символы (пробелы и табуляции) в начале логической строки используются для вычисления уровня отступа строки, который, в свою очередь, используется для определения группировки инструкций.121122Символы табуляции заменяются (слева направо) на от одного до восьми пробелов так, чтобы общее количество символов до и включая замену было кратно восьми (это то же правило, что используется в Unix). Общее количество пробелов перед первым непробельным символом затем определяет отступ строки. Отступ нельзя разделить на несколько физических строк с помощью обратной косой черты; пробельные символы до первой обратной косой черты определяют отступ.123124Отступ считается недопустимым, если исходный файл смешивает табуляции и пробелы таким образом, что смысл зависит от того, какому количеству пробелов равна табуляция; в этом случае возбуждается [`TabError`](https://python-all.ru/3.15/library/exceptions.html#TabError).125126**Примечание о кроссплатформенной совместимости:** из-за особенностей текстовых редакторов на платформах, отличных от UNIX, не рекомендуется использовать смесь пробелов и табуляции для отступов в одном исходном файле. Также следует отметить, что разные платформы могут явно ограничивать максимальный уровень отступа.127128Символ перевода страницы может присутствовать в начале строки; он будет игнорироваться при вычислении отступа, описанном выше. Символы перевода страницы, встречающиеся в других местах начальных пробельных символов, имеют неопределённый эффект (например, они могут сбросить счётчик пробелов до нуля).129130Уровни отступов последовательных строк используются для генерации токенов [`INDENT`](https://python-all.ru/3.15/library/token.html#token.INDENT) и [`DEDENT`](https://python-all.ru/3.15/library/token.html#token.DEDENT) с помощью стека следующим образом.131132Перед чтением первой строки файла в стек помещается ноль; он никогда не будет извлечён снова. Числа, помещаемые в стек, будут всегда строго возрастать от нижней части к верхней. В начале каждой логической строки её уровень отступа сравнивается с верхушкой стека. Если они равны, ничего не происходит. Если он больше, он помещается в стек, и генерируется один токен `INDENT`. Если он меньше, он *должен* быть одним из чисел, уже присутствующих в стеке; все числа в стеке, которые больше, извлекаются, и для каждого извлечённого числа генерируется токен `DEDENT`. В конце файла генерируется токен `DEDENT` для каждого числа, оставшегося в стеке и большего нуля.133134Вот пример корректно (хотя и запутанно) оформленного отступами фрагмента кода Python:135136```python137def perm(l):138 # Вычислить список всех перестановок l139 if len(l) <= 1:140 return [l]141 r = []142 for i in range(len(l)):143 s = l[:i] + l[i+1:]144 p = perm(s)145 for x in p:146 r.append(l[i:i+1] + x)147 return r148```149150Следующий пример показывает различные ошибки отступов:151152```python153 def perm(l): # ошибка: первая строка с отступом154for i in range(len(l)): # ошибка: нет отступа155 s = l[:i] + l[i+1:]156 p = perm(l[:i] + l[i+1:]) # ошибка: неожиданный отступ157 for x in p:158 r.append(l[i:i+1] + x)159 return r # ошибка: несоответствие отступа160```161162(На самом деле первые три ошибки обнаруживаются синтаксическим анализатором; только последняя ошибка обнаруживается лексическим анализатором – отступ `return r` не соответствует уровню, извлечённому из стека.)163164### 2.1.9. Пробельные символы между токенами165166За исключением начала логической строки или строковых литералов, пробельные символы (пробел, табуляция, перевод страницы) могут использоваться взаимозаменяемо для разделения токенов:167168```169170whitespace: ' ' | tab | formfeed171```172173Пробельные символы нужны между двумя токенами только в том случае, если их слияние может быть интерпретировано как другой токен. Например, `ab` – один токен, но `a b` – два токена. Однако `+a` и `+ a` оба дают два токена, `+` и `a`, поскольку `+a` не является допустимым токеном.174175### 2.1.10. Конечный маркер176177В конце неинтерактивного ввода лексический анализатор генерирует токен [`ENDMARKER`](https://python-all.ru/3.15/library/token.html#token.ENDMARKER).178179## 2.2. Прочие токены180181Помимо [`NEWLINE`](https://python-all.ru/3.15/library/token.html#token.NEWLINE), [`INDENT`](https://python-all.ru/3.15/library/token.html#token.INDENT) и [`DEDENT`](https://python-all.ru/3.15/library/token.html#token.DEDENT), существуют следующие категории токенов: *идентификаторы* и *ключевые слова* ([`NAME`](https://python-all.ru/3.15/library/token.html#token.NAME)), *литералы* (такие как [`NUMBER`](https://python-all.ru/3.15/library/token.html#token.NUMBER) и [`STRING`](https://python-all.ru/3.15/library/token.html#token.STRING)), а также другие символы (*операторы* и *разделители*, [`OP`](https://python-all.ru/3.15/library/token.html#token.OP)). Пробельные символы (за исключением терминаторов логических строк, рассмотренных ранее) не являются токенами, а служат для разделения токенов. При неоднозначности токен включает самую длинную возможную строку, образующую допустимый токен при чтении слева направо.182183## 2.3. Имена (идентификаторы и ключевые слова)184185Токены [`NAME`](https://python-all.ru/3.15/library/token.html#token.NAME) представляют *идентификаторы*, *ключевые слова* и *мягкие ключевые слова*.186187Имена состоят из следующих символов:188189- прописные и строчные буквы (`A-Z` и `a-z`),190- символ подчёркивания (`_`),191- цифры (от `0` до `9`), которые не могут быть первым символом, и192- не-ASCII символы. Допустимые имена могут содержать только «буквоподобные» и «цифроподобные» символы; подробности см. в разделе [Не-ASCII символы в именах](https://python-all.ru/3.15/reference/lexical_analysis.html#lexical-names-nonascii).193194Имена должны содержать хотя бы один символ, но верхнего ограничения длины нет. Регистр имеет значение.195196Формально имена описываются следующими лексическими определениями:197198```199200NAME: name_start name_continue*201name_start: "a"..."z" | "A"..."Z" | "_" | <non-ASCII character>202name_continue: name_start | "0"..."9"203identifier: <NAME, except keywords>204```205206Обратите внимание, что не все имена, соответствующие этой грамматике, являются допустимыми; подробности см. в разделе [Не-ASCII символы в именах](https://python-all.ru/3.15/reference/lexical_analysis.html#lexical-names-nonascii).207208### 2.3.1. Ключевые слова209210Следующие имена используются как зарезервированные слова, или *ключевые слова* языка, и не могут использоваться в качестве обычных идентификаторов. Они должны записываться в точности так, как указано ниже:211212```text213False await else import pass214None break except in raise215True class finally is return216and continue for lambda try217as def from nonlocal while218assert del global not with219async elif if or yield220```221222### 2.3.2. Мягкие ключевые слова223224Добавлено в версии 3.10.225226Некоторые имена зарезервированы только в определённых контекстах. Они называются *мягкими ключевыми словами*:227228- `match`, `case` и `_` при использовании в инструкции [`match`](https://python-all.ru/3.15/reference/compound_stmts.html#match).229- `type` при использовании в инструкции [`type`](https://python-all.ru/3.15/reference/simple_stmts.html#type).230- `lazy`, если используется перед инструкцией [`import`](https://python-all.ru/3.15/reference/simple_stmts.html#import).231232Синтаксически они ведут себя как ключевые слова в своих контекстах, но это различие проводится на уровне синтаксического анализатора, а не при токенизации.233234Будучи мягкими ключевыми словами, их использование в грамматике возможно, при этом сохраняется совместимость с существующим кодом, который использует эти имена как имена идентификаторов.235236Изменено в версии 3.12: `type` теперь является мягким ключевым словом.237238Изменено в версии 3.15: `lazy` теперь является мягким ключевым словом.239240### 2.3.3. Зарезервированные классы идентификаторов241242Некоторые классы идентификаторов (помимо ключевых слов) имеют специальное значение. Эти классы определяются по шаблонам ведущих и завершающих символов подчёркивания:243244**`_*`**245246Не импортируется инструкцией `from module import *`.247248**`_`**249250В шаблоне `case` внутри инструкции [`match`](https://python-all.ru/3.15/reference/compound_stmts.html#match) `_` является [мягким ключевым словом](https://python-all.ru/3.15/reference/lexical_analysis.html#soft-keywords), которое обозначает [шаблонный символ (wildcard)](https://python-all.ru/3.15/reference/compound_stmts.html#wildcard-patterns).251252Отдельно, интерактивный интерпретатор делает результат последнего вычисления доступным в переменной `_`. (Он хранится в модуле [`builtins`](https://python-all.ru/3.15/library/builtins.html#module-builtins) вместе со встроенными функциями, такими как `print`.)253254В других контекстах `_` – это обычный идентификатор. Его часто используют для именования «особых» элементов, но для самого Python он не является специальным.255256> **Примечание**257>258> Имя `_` часто используется в связи с интернационализацией; обратитесь к документации модуля [`gettext`](https://python-all.ru/3.15/library/gettext.html#module-gettext) для получения дополнительной информации об этом соглашении.259>260> Оно также часто используется для неиспользуемых переменных.261262**`__*__`**263264Системные имена, неформально известные как «dunder»-имена. Эти имена определяются интерпретатором и его реализацией (включая стандартную библиотеку). Текущие системные имена обсуждаются в разделе [Специальные имена методов](https://python-all.ru/3.15/reference/datamodel.html#specialnames) и в других местах. Вероятно, в будущих версиях Python будут определены новые. *Любое* использование `__*__` имён, в любом контексте, не соответствующее явно документированному использованию, может быть нарушено без предупреждения.265266**`__*`**267268Приватные имена классов. Имена этой категории при использовании в контексте определения класса переписываются в искажённую форму, чтобы избежать конфликтов имён между «приватными» атрибутами базовых и производных классов. См. раздел [Идентификаторы (имена)](https://python-all.ru/3.15/reference/expressions.html#atom-identifiers).269270### 2.3.4. Не-ASCII символы в именах271272Имена, содержащие не-ASCII символы, требуют дополнительной нормализации и проверки, помимо правил и грамматики, описанных [выше](https://python-all.ru/3.15/reference/lexical_analysis.html#identifiers). Например, `ř_1`, `蛇` или `साँप` являются допустимыми именами, а `r〰2`, `€` или `🐍` – нет.273274В этом разделе объясняются точные правила.275276Все имена при синтаксическом анализе преобразуются в [форму нормализации](https://python-all.ru/3.15/reference/lexical_analysis.html) NFKC. Это означает, что, например, некоторые типографские варианты символов преобразуются в свою «базовую» форму. Например, `fiⁿₐˡᵢᶻₐᵗᵢᵒₙ` нормализуется в `finalization`, поэтому Python считает их одним и тем же именем:277278```python279>>> fiⁿₐˡᵢᶻₐᵗᵢᵒₙ = 3280>>> finalization2813282```283284> **Примечание**285>286> Нормализация выполняется только на лексическом уровне. Функции времени выполнения, которые принимают имена в виде *строк*, обычно не нормализуют свои аргументы. Например, определённая выше переменная доступна во время выполнения в словаре [`globals()`](https://python-all.ru/3.15/library/functions.html#globals) как `globals()["finalization"]`, но не как `globals()["fiⁿₐˡᵢᶻₐᵗᵢᵒₙ"]`.287288Аналогично тому, как имена, состоящие только из ASCII, должны содержать только буквы, цифры и символ подчёркивания и не могут начинаться с цифры, допустимое имя должно начинаться с символа из «буквоподобного» набора `xid_start`, а остальные символы должны быть из «букво- и цифроподобного» набора `xid_continue`.289290Эти наборы основаны на множествах *XID\_Start* и *XID\_Continue*, определённых в приложении к стандарту Unicode [UAX-31](https://python-all.ru/3.15/reference/lexical_analysis.html). Python’s `xid_start` дополнительно включает символ подчёркивания (`_`). Обратите внимание, что Python не обязательно соответствует [UAX-31](https://python-all.ru/3.15/reference/lexical_analysis.html).291292Неформальный перечень символов из множеств *XID\_Start* и *XID\_Continue*, определённых в стандарте Unicode, доступен в файле [DerivedCoreProperties.txt](https://python-all.ru/3.15/reference/lexical_analysis.html) в базе данных символов Unicode. Для справки, правила построения наборов `xid_*` приведены ниже.293294Множество `id_start` определяется как объединение:295296- Категория Unicode `<Lu>` – прописные буквы (включает `A` – `Z`)297- Категория Unicode `<Ll>` – строчные буквы (включает `a` – `z`)298- Категория Unicode `<Lt>` – буквы заглавного регистра299- Категория Unicode `<Lm>` – модифицирующие буквы300- Категория Unicode `<Lo>` – прочие буквы301- Категория Unicode `<Nl>` – буквенные числа302- {`"_"`} – символ подчёркивания303- `<Other_ID_Start>` – явный набор символов из [PropList.txt](https://python-all.ru/3.15/reference/lexical_analysis.html) для поддержки обратной совместимости304305Множество `xid_start` затем замыкает это множество относительно нормализации NFKC, удаляя все символы, чья нормализация не имеет вида `id_start id_continue*`.306307Множество `id_continue` определяется как объединение:308309- `id_start` (см. выше)310- Категория Unicode `<Nd>` – десятичные числа (включает `0` – `9`)311- Категория Unicode `<Pc>` – соединительные знаки пунктуации312- Категория Unicode `<Mn>` – некомбинируемые знаки313- Категория Unicode `<Mc>` – комбинируемые знаки с увеличением ширины314- `<Other_ID_Continue>` – ещё один явный набор символов из [PropList.txt](https://python-all.ru/3.15/reference/lexical_analysis.html) для поддержки обратной совместимости315316Снова `xid_continue` замыкает это множество относительно нормализации NFKC.317318Категории Unicode используют версию базы данных символов Unicode, включённую в модуль [`unicodedata`](https://python-all.ru/3.15/library/unicodedata.html#module-unicodedata).319320> **См. также**321>322> - [**PEP 3131**](https://python-all.ru/3.15/reference/lexical_analysis.html) – Поддержка не-ASCII идентификаторов323> - [**PEP 672**](https://python-all.ru/3.15/reference/lexical_analysis.html) – Соображения безопасности, связанные с Unicode, для Python324325## 2.4. Литералы326327Литералы – это обозначения константных значений некоторых встроенных типов.328329С точки зрения лексического анализа, Python имеет [string, bytes](https://python-all.ru/3.15/reference/lexical_analysis.html#strings) и [numeric](https://python-all.ru/3.15/reference/lexical_analysis.html#numbers) литералы.330331Другие «литералы» лексически обозначаются с помощью [ключевых слов](https://python-all.ru/3.15/reference/lexical_analysis.html#keywords) (`None`, `True`, `False`) и специального [токена многоточия](https://python-all.ru/3.15/reference/lexical_analysis.html#lexical-ellipsis) (`...`).332333## 2.5. Строковые литералы и литералы байтов334335Строковые литералы – это текст, заключённый в одинарные (`'`) или двойные кавычки (`"`). Например:336337```python338"spam"339'eggs'340```341342Кавычка, открывающая литерал, также и закрывает его, поэтому строковый литерал может содержать только другую кавычку (за исключением управляющих последовательностей, см. ниже). Например:343344```python345'Say "Hello", please.'346"Don't do that!"347```348349За исключением этого ограничения, выбор символа кавычки (`'` или `"`) не влияет на то, как разбирается литерал.350351Внутри строкового литерала символ обратной косой черты (`\`) вводит *управляющую последовательность*, имеющую специальное значение в зависимости от символа после обратной косой черты. Например, `\"` обозначает символ двойной кавычки и *не* завершает строку:352353```pycon354>>> print("Say \"Hello\" to everyone!")355Say "Hello" to everyone!356```357358См. [управляющие последовательности](https://python-all.ru/3.15/reference/lexical_analysis.html#escape-sequences) ниже для полного списка таких последовательностей и дополнительных подробностей.359360### 2.5.1. Строки в тройных кавычках361362Строки также могут быть заключены в соответствующие группы из трёх одинарных или двойных кавычек. Их обычно называют *строками с тройными кавычками*:363364```python365"""Это строка в тройных кавычках."""366```367368В литералах с тройными кавычками допускаются неэкранированные кавычки (и они сохраняются), за исключением того, что три неэкранированные кавычки подряд завершают литерал, если они того же типа (`'` или `"`), что использовались в начале:369370```python371"""В этой строке есть "кавычки" внутри."""372```373374Неэкранированные символы новой строки также допускаются и сохраняются:375376```python377'''Эта строка в тройных кавычках378продолжается на следующей строке.'''379```380381### 2.5.2. Префиксы строк382383Строковые литералы могут иметь необязательный *префикс*, который влияет на то, как разбирается содержимое литерала, например:384385```python386b"data"387f'{result=}'388```389390Допустимые префиксы:391392- `b`: [Литерал байтов](https://python-all.ru/3.15/reference/lexical_analysis.html#bytes-literal)393- `r`: [Сырая строка](https://python-all.ru/3.15/reference/lexical_analysis.html#raw-strings)394- `f`: [Форматированный строковый литерал](https://python-all.ru/3.15/reference/lexical_analysis.html#f-strings) («f-строка»)395- `t`: [Шаблонный строковый литерал](https://python-all.ru/3.15/reference/lexical_analysis.html#t-strings) («t-строка»)396- `u`: Нет эффекта (допускается для обратной совместимости)397398Подробнее о каждом типе см. в соответствующих разделах по ссылкам.399400Префиксы нечувствительны к регистру (например, «`B`» работает так же, как «`b`»). Префикс «`r`» можно комбинировать с «`f`», «`t`» или «`b`», так что «`fr`», «`rf`», «`tr`», «`rt`», «`br`» и «`rb`» также являются допустимыми префиксами.401402Добавлено в версии 3.3: Префикс `'rb'` для сырых байтовых литералов был добавлен как синоним `'br'`.403404Поддержка устаревшего литерала Unicode (`u'value'`) была восстановлена, чтобы упростить поддержку кодовых баз, работающих одновременно на Python 2.x и 3.x. Подробнее см. [**PEP 414**](https://python-all.ru/3.15/reference/lexical_analysis.html).405406### 2.5.3. Формальная грамматика407408Строковые литералы, за исключением [«f-строк»](https://python-all.ru/3.15/reference/lexical_analysis.html#f-strings) и [«t-строк»](https://python-all.ru/3.15/reference/lexical_analysis.html#t-strings), описываются следующими лексическими определениями.409410В этих определениях используются [отрицательные опережающие проверки](https://python-all.ru/3.15/reference/introduction.html#lexical-lookaheads) (`!`), чтобы указать, что конечная кавычка завершает литерал.411412```413414STRING: [stringprefix] (stringcontent)415stringprefix: <("r" | "u" | "b" | "br" | "rb"), case-insensitive>416stringcontent:417 | "'''" ( !"'''" longstringitem)* "'''"418 | '"""' ( !'"""' longstringitem)* '"""'419 | "'" ( !"'" stringitem)* "'"420 | '"' ( !'"' stringitem)* '"'421stringitem: stringchar | stringescapeseq422stringchar: <any source_character, except backslash and newline>423longstringitem: stringitem | newline424stringescapeseq: "\" <any source_character>425```426427Обратите внимание, что, как и во всех лексических определениях, пробельные символы значимы. В частности, префикс (если он есть) должен непосредственно предшествовать открывающей кавычке.428429### 2.5.4. Escape-последовательности430431Если не указан префикс «`r`» или «`R`», escape-последовательности в строковых и байтовых литералах интерпретируются по правилам, аналогичным используемым в стандартном C. Распознаваемые escape-последовательности:432433| Escape-последовательность | Значение |434| --- | --- |435| `\`\<новая строка\> | [Игнорируемый конец строки](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-ignore) |436| `\\` | [Обратная косая черта](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-escaped-char) |437| `\'` | [Одинарная кавычка](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-escaped-char) |438| `\"` | [Двойная кавычка](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-escaped-char) |439| `\a` | ASCII Bell (BEL) |440| `\b` | ASCII Backspace (BS) |441| `\f` | ASCII Formfeed (FF) |442| `\n` | ASCII Linefeed (LF) |443| `\r` | ASCII Carriage Return (CR) |444| `\t` | ASCII горизонтальная табуляция (TAB) |445| `\v` | ASCII вертикальная табуляция (VT) |446| `\ooo` | [восьмеричный символ](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-oct) |447| `\xhh` | [шестнадцатеричный символ](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-hex) |448| `\N{name}` | [именованный символ Unicode](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-named) |449| `\uxxxx` | [шестнадцатеричный символ Unicode](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-long-hex) |450| `\Uxxxxxxxx` | [шестнадцатеричный символ Unicode](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-long-hex) |451452#### 2.5.4.1. Игнорируемый конец строки453454Обратную косую черту можно добавить в конце строки, чтобы игнорировать символ новой строки:455456```python457>>> 'This string will not include \458... backslashes or newline characters.'459'This string will not include backslashes or newline characters.'460```461462Того же результата можно достичь с помощью [строк в тройных кавычках](https://python-all.ru/3.15/reference/lexical_analysis.html#strings), или круглых скобок и [конкатенации строковых литералов](https://python-all.ru/3.15/reference/expressions.html#string-concatenation).463464#### 2.5.4.2. Экранированные символы465466Чтобы включить обратную косую черту в [необработанный](https://python-all.ru/3.15/reference/lexical_analysis.html#raw-strings) строковый литерал Python, её нужно удвоить. Управляющая последовательность `\\` обозначает один символ обратной косой черты:467468```python469>>> print('C:\\Program Files')470C:\Program Files471```472473Аналогично, последовательности `\'` и `\"` обозначают символы одинарной и двойной кавычки соответственно:474475```python476>>> print('\' and \"')477' and "478```479480#### 2.5.4.3. Восьмеричный символ481482Последовательность `\ooo` обозначает *символ* с восьмеричным (основание 8) значением *ooo*:483484```python485>>> '\120'486'P'487```488489Допускается до трёх восьмеричных цифр (от 0 до 7).490491В литерале bytes *символ* означает *байт* с заданным значением. В строковом литерале он означает символ Unicode с заданным значением.492493Изменено в версии 3.11: Восьмеричные управляющие последовательности со значением больше `0o377` (255) вызывают [`DeprecationWarning`](https://python-all.ru/3.15/library/exceptions.html#DeprecationWarning).494495Изменено в версии 3.12: Восьмеричные управляющие последовательности со значением больше `0o377` (255) вызывают [`SyntaxWarning`](https://python-all.ru/3.15/library/exceptions.html#SyntaxWarning). В будущей версии Python они будут вызывать [`SyntaxError`](https://python-all.ru/3.15/library/exceptions.html#SyntaxError).496497#### 2.5.4.4. Шестнадцатеричный символ498499Последовательность `\xhh` обозначает *символ* с шестнадцатеричным (основание 16) значением *hh*:500501```python502>>> '\x50'503'P'504```505506В отличие от стандартного C, требуется ровно две шестнадцатеричные цифры.507508В литерале bytes *символ* означает *байт* с заданным значением. В строковом литерале он означает символ Unicode с заданным значением.509510#### 2.5.4.5. Именованный символ Unicode511512Последовательность `\N{name}` обозначает символ Unicode с заданным *именем*:513514```python515>>> '\N{LATIN CAPITAL LETTER P}'516'P'517>>> '\N{SNAKE}'518'🐍'519```520521Эта последовательность не может появляться в [литералах bytes](https://python-all.ru/3.15/reference/lexical_analysis.html#bytes-literal).522523Изменено в версии 3.3: Добавлена поддержка [псевдонимов имён](https://python-all.ru/3.15/reference/lexical_analysis.html) .524525#### 2.5.4.6. Шестнадцатеричные символы Unicode526527Эти последовательности `\uxxxx` и `\Uxxxxxxxx` обозначают символ Unicode с заданным шестнадцатеричным (основание 16) значением. Для `\u` требуется ровно четыре цифры; для `\U` требуется ровно восемь цифр. Последняя может кодировать любой символ Unicode.528529```pycon530>>> '\u1234'531'ሴ'532>>> '\U0001f40d'533'🐍'534```535536Эти последовательности не могут появляться в [литералах bytes](https://python-all.ru/3.15/reference/lexical_analysis.html#bytes-literal).537538#### 2.5.4.7. Неизвестные escape-последовательности539540В отличие от стандартного C, все неизвестные escape-последовательности остаются в строке без изменений, то есть *обратная косая черта сохраняется в результате*:541542```python543>>> print('\q')544\q545>>> list('\q')546['\\', 'q']547```548549Обратите внимание: для байтовых литералов escape-последовательности, распознаваемые только в строковых литералах (`\N...`, `\u...`, `\U...`), относятся к категории нераспознанных escape-последовательностей.550551Изменено в версии 3.6: Нераспознанные escape-последовательности приводят к появлению [`DeprecationWarning`](https://python-all.ru/3.15/library/exceptions.html#DeprecationWarning).552553Изменено в версии 3.12: Нераспознанные escape-последовательности приводят к появлению [`SyntaxWarning`](https://python-all.ru/3.15/library/exceptions.html#SyntaxWarning). В будущей версии Python они будут вызывать [`SyntaxError`](https://python-all.ru/3.15/library/exceptions.html#SyntaxError).554555### 2.5.5. Байтовые литералы556557*Байтовые литералы* всегда имеют префикс '`b`' или '`B`'; они создают экземпляр типа [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes) вместо типа [`str`](https://python-all.ru/3.15/library/stdtypes.html#str). Они могут содержать только символы ASCII; байты со значением 128 или больше должны быть представлены с помощью escape-последовательностей (обычно [шестнадцатеричный символ](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-hex) или [восьмеричный символ](https://python-all.ru/3.15/reference/lexical_analysis.html#string-escape-oct)):558559```pycon560>>> b'\x89PNG\r\n\x1a\n'561b'\x89PNG\r\n\x1a\n'562>>> list(b'\x89PNG\r\n\x1a\n')563[137, 80, 78, 71, 13, 10, 26, 10]564```565566Аналогично, нулевой байт должен быть выражен с помощью escape-последовательности (обычно `\0` или `\x00`).567568### 2.5.6. Сырые строковые литералы569570Как строковые, так и байтовые литералы могут по желанию иметь префикс '`r`' или '`R`'; такие конструкции называются *сырыми строковыми литералами* и *сырыми байтовыми литералами* соответственно и обрабатывают обратную косую черту как буквенный символ. В результате в сырых строковых литералах [escape-последовательности](https://python-all.ru/3.15/reference/lexical_analysis.html#escape-sequences) не обрабатываются особым образом:571572```pycon573>>> r'\d{4}-\d{2}-\d{2}'574'\\d{4}-\\d{2}-\\d{2}'575```576577Даже в сыром литерале кавычки можно экранировать обратной косой чертой, но обратная косая черта остаётся в результате; например, `r"\""` – это допустимый строковый литерал, состоящий из двух символов: обратной косой черты и двойной кавычки; `r"\"` – это недопустимый строковый литерал (даже сырая строка не может заканчиваться нечётным количеством обратных косых черт). В частности, *сырой литерал не может заканчиваться одной обратной косой чертой* (поскольку обратная косая черта экранировала бы следующий символ кавычки). Также обратите внимание, что одиночная обратная косая черта, за которой следует новая строка, интерпретируется как эти два символа в составе литерала, *а не* как продолжение строки.578579### 2.5.7. f-строки580581Добавлено в версии 3.6.582583Изменено в версии 3.7: В выражениях внутри f-строк теперь можно использовать [`await`](https://python-all.ru/3.15/reference/expressions.html#await) и [`async for`](https://python-all.ru/3.15/reference/compound_stmts.html#async-for).584585Изменено в версии 3.8: Добавлен спецификатор отладки (`=`)586587Изменено в версии 3.12: Снято множество ограничений на выражения внутри f-строк. В частности, теперь разрешены вложенные строки, комментарии и обратные косые черты.588589*Форматированный строковый литерал* или *f-строка* – это строковый литерал с префиксом '`f`' или '`F`'. В отличие от других строковых литералов, f-строки не имеют постоянного значения. Они могут содержать *поля подстановки*, ограниченные фигурными скобками `{}`. Поля подстановки содержат выражения, которые вычисляются во время выполнения. Например:590591```python592>>> who = 'nobody'593>>> nationality = 'Spanish'594>>> f'{who.title()} expects the {nationality} Inquisition!'595'Nobody expects the Spanish Inquisition!'596```597598Любые удвоенные фигурные скобки (`{{` или `}}`) вне полей подстановки заменяются соответствующей одинарной фигурной скобкой:599600```python601>>> print(f'{{...}}')602{...}603```604605Другие символы вне полей подстановки обрабатываются как в обычных строковых литералах. Это означает, что escape-последовательности декодируются (за исключением случаев, когда литерал также помечен как сырая строка), и в f-строках с тройными кавычками возможны новые строки:606607```python608>>> name = 'Galahad'609>>> favorite_color = 'blue'610>>> print(f'{name}:\t{favorite_color}')611Galahad: blue612>>> print(rf"C:\Users\{name}")613C:\Users\Galahad614>>> print(f'''Three shall be the number of the counting615... and the number of the counting shall be three.''')616Three shall be the number of the counting617and the number of the counting shall be three.618```619620Выражения в форматированных строковых литералах обрабатываются как обычные выражения Python. Каждое выражение вычисляется в контексте, где появляется форматированный строковый литерал, слева направо. Пустое выражение не допускается, и как [`lambda`](https://python-all.ru/3.15/reference/expressions.html#lambda), так и выражения присваивания `:=` должны быть окружены явными круглыми скобками:621622```python623>>> f'{(half := 1/2)}, {half * 42}'624'0.5, 21.0'625```626627Повторное использование типа кавычек внешней f-строки внутри поля подстановки разрешено:628629```python630>>> a = dict(x=2)631>>> f"abc {a["x"]} def"632'abc 2 def'633```634635Обратные косые черты также допускаются в полях подстановки и вычисляются так же, как в любом другом контексте:636637```python638>>> a = ["a", "b", "c"]639>>> print(f"List a contains:\n{"\n".join(a)}")640List a contains:641a642b643c644```645646Возможно вложение f-строк:647648```python649>>> name = 'world'650>>> f'Repeated:{f' hello {name}' * 3}'651'Repeated: hello world hello world hello world'652```653654Переносимые программы на Python не должны использовать более 5 уровней вложенности.655656**Особенность реализации CPython:** CPython не ограничивает вложенность f-строк.657658Выражения подстановки могут содержать новые строки как в f-строках с одинарными кавычками, так и с тройными, и они могут содержать комментарии. Всё, что следует после `#` внутри поля подстановки, является комментарием (даже закрывающие скобки и кавычки). Это означает, что поля подстановки с комментариями должны быть закрыты на другой строке:659660```text661>>> a = 2662>>> f"abc{a # This comment }" continues until the end of the line663... + 3}"664'abc5'665```666667После выражения поля подстановки могут по желанию содержать:668669- *спецификатор отладки* – знак равенства (`=`), по желанию окружённый пробелами с одной или обеих сторон;670- *спецификатор преобразования* – `!s`, `!r` или `!a`; и/или671- *спецификатор формата* с префиксом в виде двоеточия (`:`).672673См. [раздел «f-строки» в стандартной библиотеке](https://python-all.ru/3.15/library/stdtypes.html#stdtypes-fstrings) для подробностей о том, как вычисляются эти поля.674675Как объясняется в этом разделе, *спецификаторы формата* передаются вторым аргументом функции [`format()`](https://python-all.ru/3.15/library/functions.html#format) для форматирования значения поля подстановки. Например, их можно использовать для указания ширины поля и символов заполнения с помощью [миниязыка спецификации формата](https://python-all.ru/3.15/library/string.html#formatspec):676677```python678>>> number = 14.3679>>> f'{number:20.7f}'680' 14.3000000'681```682683Спецификаторы формата верхнего уровня могут включать вложенные поля подстановки:684685```python686>>> field_size = 20687>>> precision = 7688>>> f'{number:{field_size}.{precision}f}'689' 14.3000000'690```691692Эти вложенные поля могут включать собственные поля преобразования и [спецификаторы формата](https://python-all.ru/3.15/library/string.html#formatspec):693694```python695>>> number = 3696>>> f'{number:{field_size}}'697' 3'698>>> f'{number:{field_size:05}}'699'00000000000000000003'700```701702Однако эти вложенные поля не могут включать более глубоко вложенные поля подстановки.703704Форматированные строковые литералы не могут использоваться в качестве [строк документации](https://python-all.ru/3.15/glossary.html#term-docstring), даже если они не содержат выражений:705706```python707>>> def foo():708... f"Not a docstring"709...710>>> print(foo.__doc__)711None712```713714> **См. также**715>716> - [**PEP 498**](https://python-all.ru/3.15/reference/lexical_analysis.html) – Интерполяция строковых литералов717> - [**PEP 701**](https://python-all.ru/3.15/reference/lexical_analysis.html) – Синтаксическая формализация f-строк718> - [`str.format()`](https://python-all.ru/3.15/library/stdtypes.html#str.format), в котором используется связанный механизм строк форматирования.719720### 2.5.8. t-строки721722Добавлено в версии 3.14.723724*Шаблонный строковый литерал* или *t-строка* – это строковый литерал с префиксом ‘`t`’ или ‘`T`’. Такие строки подчиняются тем же правилам синтаксиса, что и [f-строки (форматированные строковые литералы)](https://python-all.ru/3.15/reference/lexical_analysis.html#f-strings). Об отличиях в правилах вычисления см. [раздел о t-строках в стандартной библиотеке](https://python-all.ru/3.15/library/stdtypes.html#stdtypes-tstrings)725726### 2.5.9. Формальная грамматика f-строк727728F-строки обрабатываются частично [лексическим анализатором](https://python-all.ru/3.15/glossary.html#term-lexical-analyzer), который генерирует токены [`FSTRING_START`](https://python-all.ru/3.15/library/token.html#token.FSTRING_START), [`FSTRING_MIDDLE`](https://python-all.ru/3.15/library/token.html#token.FSTRING_MIDDLE) и [`FSTRING_END`](https://python-all.ru/3.15/library/token.html#token.FSTRING_END), а частично – парсером, который обрабатывает выражения в поле подстановки. Точное распределение работы зависит от реализации CPython.729730Соответственно, грамматика f-строк представляет собой смесь [лексических и синтаксических определений](https://python-all.ru/3.15/reference/introduction.html#notation-lexical-vs-syntactic).731732Пробельные символы значимы в следующих ситуациях:733734- В [`FSTRING_START`](https://python-all.ru/3.15/library/token.html#token.FSTRING_START) не должно быть пробелов (между префиксом и кавычкой).735- Пробелы в [`FSTRING_MIDDLE`](https://python-all.ru/3.15/library/token.html#token.FSTRING_MIDDLE) являются частью содержимого строкового литерала.736- В `fstring_replacement_field`, если присутствует `f_debug_specifier`, все пробелы после открывающей фигурной скобки до `f_debug_specifier`, а также пробелы, следующие непосредственно за `f_debug_specifier`, сохраняются как часть выражения.737738 **Деталь реализации CPython:** Выражение не обрабатывается на этапе токенизации; оно извлекается из исходного кода с использованием позиций токена `{` и токена после `=`.739740Определение `FSTRING_MIDDLE` использует [отрицательные опережающие проверки](https://python-all.ru/3.15/reference/introduction.html#lexical-lookaheads) (`!`) для обозначения специальных символов (обратная косая черта, новая строка, `{`, `}`) и последовательностей (`f_quote`).741742```743744fstring: FSTRING_START fstring_middle* FSTRING_END745746FSTRING_START: fstringprefix ("'" | '"' | "'''" | '"""')747FSTRING_END: f_quote748fstringprefix: <("f" | "fr" | "rf"), case-insensitive>749f_debug_specifier: '='750f_quote: <the quote character(s) used in FSTRING_START>751752fstring_middle:753 | fstring_replacement_field754 | FSTRING_MIDDLE755FSTRING_MIDDLE:756 | (!"\" !newline !'{' !'}' !f_quote) source_character757 | stringescapeseq758 | "{{"759 | "}}"760 | <newline, in triple-quoted f-strings only>761fstring_replacement_field:762 | '{' f_expression [f_debug_specifier] [fstring_conversion]763 [fstring_full_format_spec] '}'764fstring_conversion:765 | "!" ("s" | "r" | "a")766fstring_full_format_spec:767 | ':' fstring_format_spec*768fstring_format_spec:769 | FSTRING_MIDDLE770 | fstring_replacement_field771f_expression:772 | ','.(conditional_expression | "*" or_expr)+ [","]773 | yield_expression774```775776> **Примечание**777>778> В приведённом фрагменте грамматики правила `f_quote` и `FSTRING_MIDDLE` являются контекстно-зависимыми – они зависят от содержимого `FSTRING_START` ближайшего окружающего `fstring`.779>780> Построение более традиционной формальной грамматики из этого шаблона оставляется читателю в качестве упражнения.781782Грамматика t-строк идентична грамматике f-строк, с заменой *t* на *f* в начале имён правил и токенов, а также в префиксе.783784```785786tstring: TSTRING_START tstring_middle* TSTRING_END787788<rest of the t-string grammar is omitted; see above>789```790791## 2.6. Числовые литералы792793Токены [`NUMBER`](https://python-all.ru/3.15/library/token.html#token.NUMBER) представляют числовые литералы, которые бывают трёх типов: целые числа, числа с плавающей точкой и мнимые числа.794795```796797NUMBER: integer | floatnumber | imagnumber798```799800Числовое значение числового литерала совпадает со значением, которое получилось бы при передаче строки конструктору класса [`int`](https://python-all.ru/3.15/library/functions.html#int), [`float`](https://python-all.ru/3.15/library/functions.html#float) или [`complex`](https://python-all.ru/3.15/library/functions.html#complex) соответственно. Обратите внимание, что не все допустимые входные данные для этих конструкторов являются литералами.801802Числовые литералы не включают знак; выражение вроде `-1` – это на самом деле выражение, состоящее из унарного оператора ‘`-`’ и литерала `1`.803804### 2.6.1. Целочисленные литералы805806Целочисленные литералы обозначают целые числа. Например:807808```python809781038112147483647812```813814Длина целочисленных литералов не ограничена ничем, кроме доступной памяти:815816```python8177922816251426433759354395033679228162514264337593543950336818```819820Символы подчёркивания можно использовать для группировки цифр для улучшения читаемости; они игнорируются при определении числового значения литерала. Например, следующие литералы эквивалентны:821822```python823100_000_000_0008241000000000008251_00_00_00_00_000826```827828Символы подчёркивания могут находиться только между цифрами. Например, `_123`, `321_` и `123__321` *не* являются допустимыми литералами.829830Целые числа могут быть заданы в двоичной (основание 2), восьмеричной (основание 8) или шестнадцатеричной (основание 16) системе с помощью префиксов `0b`, `0o` и `0x` соответственно. Шестнадцатеричные цифры от 10 до 15 обозначаются буквами от `A` до `F` без учёта регистра. Например:831832```python8330b1001101118340b_1110_01018350o1778360o3778370xdeadbeef8380xDead_Beef839```840841Символ подчёркивания может следовать за указателем основания. Например, `0x_1f` – допустимый литерал, а `0_x1f` и `0x__1f` – нет.842843Ведущие нули в ненулевом десятичном числе не допускаются. Например, `0123` не является допустимым литералом. Это сделано для устранения неоднозначности с восьмеричными литералами в стиле C, которые Python использовал до версии 3.0.844845Формально целочисленные литералы описываются следующими лексическими определениями:846847```848849integer: decinteger | bininteger | octinteger | hexinteger | zerointeger850decinteger: nonzerodigit (["_"] digit)*851bininteger: "0" ("b" | "B") (["_"] bindigit)+852octinteger: "0" ("o" | "O") (["_"] octdigit)+853hexinteger: "0" ("x" | "X") (["_"] hexdigit)+854zerointeger: "0"+ (["_"] "0")*855nonzerodigit: "1"..."9"856digit: "0"..."9"857bindigit: "0" | "1"858octdigit: "0"..."7"859hexdigit: digit | "a"..."f" | "A"..."F"860```861862Изменено в версии 3.6: В литералах теперь разрешены символы подчёркивания для группировки.863864### 2.6.2. Литералы с плавающей точкой865866Литералы с плавающей точкой (float), такие как `3.14` или `1.5`, обозначают [приближения вещественных чисел](https://python-all.ru/3.15/reference/datamodel.html#datamodel-float).867868Они состоят из *целой* и *дробной* частей, каждая из которых состоит из десятичных цифр. Части разделяются десятичной точкой `.`:869870```python8712.718288724.0873```874875В отличие от целочисленных литералов, ведущие нули допускаются. Например, `077.010` допустимо и обозначает то же число, что и `77.01`.876877Как и в целочисленных литералах, одиночные символы подчёркивания могут встречаться между цифрами для улучшения читаемости:878879```python88096_485.332_1238813.14_15_93882```883884Любая из этих частей, но не обе, может быть пустой. Например:885886```python88710. # (эквивалентно 10.0)888.001 # (эквивалентно 0.001)889```890891Целая и дробная части могут дополнительно сопровождаться *экспонентой*: буква `e` или `E`, после которой может идти знак (`+` или `-`), а затем число, записанное в том же формате, что и целая с дробной частями. `e` или `E` означает «умножить на десять в степени»:892893```python8941.0e3 # (представляет 1.0×10³, или 1000.0)8951.166e-5 # (представляет 1.166×10⁻⁵, или 0.00001166)8966.02214076e+23 # (представляет 6.02214076×10²³, или 602214076000000000000000.)897```898899В числах с плавающей точкой, содержащих только целую часть и экспоненту, десятичную точку можно опускать:900901```python9021e3 # (эквивалентно 1.e3 и 1.0e3)9030e0 # (эквивалентно 0.)904```905906Формально литералы с плавающей точкой описываются следующими лексическими определениями:907908```909910floatnumber:911 | digitpart "." [digitpart] [exponent]912 | "." digitpart [exponent]913 | digitpart exponent914digitpart: digit (["_"] digit)*915exponent: ("e" | "E") ["+" | "-"] digitpart916```917918Изменено в версии 3.6: В литералах теперь разрешены символы подчёркивания для группировки.919920### 2.6.3. Мнимые литералы921922В Python есть объекты [комплексных чисел](https://python-all.ru/3.15/library/stdtypes.html#typesnumeric), но нет комплексных литералов. Вместо этого *мнимые литералы* обозначают комплексные числа с нулевой действительной частью.923924Например, в математике комплексное число 3+4.2*i* записывается как действительное число 3, сложенное с мнимым числом 4.2*i*. Python использует похожий синтаксис, только мнимая единица записывается как `j` а не как *i*:925926```python9273+4.2j928```929930Это выражение состоит из [целочисленного литерала](https://python-all.ru/3.15/reference/lexical_analysis.html#integers) `3`, [оператора](https://python-all.ru/3.15/reference/lexical_analysis.html#operators) ‘`+`’ и [мнимого литерала](https://python-all.ru/3.15/reference/lexical_analysis.html#imaginary) `4.2j`. Поскольку это три отдельных токена, между ними допускаются пробелы:931932```python9333 + 4.2j934```935936Пробелы *внутри* каждого токена не допускаются. В частности, суффикс `j` не должен отделяться от числа, перед которым он стоит.937938Число перед `j` имеет тот же синтаксис, что и литерал с плавающей точкой. Таким образом, следующие мнимые литералы допустимы:939940```python9414.2j9423.14j94310.j944.001j9451e100j9463.14e-10j9473.14_15_93j948```949950В отличие от литерала с плавающей точкой, десятичную точку можно опустить, если мнимое число имеет только целую часть. Число по-прежнему вычисляется как число с плавающей точкой, а не как целое:951952```python95310j9540j9551000000000000000000000000j # эквивалентно 1e+24j956```957958Суффикс `j` не чувствителен к регистру. То есть вместо него можно использовать `J`:959960```python9613.14J # эквивалентно 3.14j962```963964Формально мнимые литералы описываются следующим лексическим определением:965966```967968imagnumber: (floatnumber | digitpart) ("j" | "J")969```970971## 2.7. Операторы и разделители972973Следующая грамматика определяет токены *операторов* и *разделителей*, то есть общий тип токенов [`OP`](https://python-all.ru/3.15/library/token.html#token.OP). [Список этих токенов и их названий](https://python-all.ru/3.15/library/token.html#token-operators-delimiters) также доступен в документации модуля `token`.974975```976977OP:978 | assignment_operator979 | bitwise_operator980 | comparison_operator981 | enclosing_delimiter982 | other_delimiter983 | arithmetic_operator984 | "..."985 | other_op986987assignment_operator: "+=" | "-=" | "*=" | "**=" | "/=" | "//=" | "%=" |988 "&=" | "|=" | "^=" | "<<=" | ">>=" | "@=" | ":="989bitwise_operator: "&" | "|" | "^" | "~" | "<<" | ">>"990comparison_operator: "<=" | ">=" | "<" | ">" | "==" | "!="991enclosing_delimiter: "(" | ")" | "[" | "]" | "{" | "}"992other_delimiter: "," | ":" | "!" | ";" | "=" | "->"993arithmetic_operator: "+" | "-" | "**" | "*" | "//" | "/" | "%"994other_op: "." | "@"995```996997> **Примечание**998>999> Обычно *операторы* используются для комбинирования [выражений](https://python-all.ru/3.15/reference/expressions.html#expressions), тогда как *разделители* служат другим целям. Однако чёткого формального разграничения между этими двумя категориями нет.1000>1001> Некоторые токены могут выступать как в роли операторов, так и в роли разделителей, в зависимости от контекста. Например, `*` – это и оператор умножения, и разделитель, используемый для распаковки последовательностей, а `@` – это и матричное умножение, и разделитель, которым начинаются декораторы.1002>1003> Для некоторых токенов различие неочевидно. Например, одни считают `.`, `(` и `)` разделителями, а другие видят в них оператор [`getattr()`](https://python-all.ru/3.15/library/functions.html#getattr) и оператор(ы) вызова функции.1004>1005> Некоторые операторы Python, такие как `and`, `or` и `not in`, используют [ключевые слова](https://python-all.ru/3.15/reference/lexical_analysis.html#keywords), а не «символы» (токены операторов).10061007Последовательность из трёх подряд идущих точек (`...`) имеет особое значение как литерал [`Ellipsis`](https://python-all.ru/3.15/library/constants.html#Ellipsis).1008