Документация Python неофициальный перевод

lexical_analysis.md

1005 строк · 79.6 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3/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/glossary.html#term-token), генерируемых *лексическим анализатором* (также называемым *токенизатором*). В этой главе описывается, как лексический анализатор создаёт эти токены.1011Лексический анализатор определяет [кодировку](https://python-all.ru/3/reference/lexical_analysis.html#encodings) текста программы (по умолчанию UTF-8) и декодирует текст в [исходные символы](https://python-all.ru/3/reference/lexical_analysis.html#lexical-source-character). Если текст не удаётся декодировать, возбуждается исключение [`SyntaxError`](https://python-all.ru/3/library/exceptions.html#SyntaxError).1213Затем лексический анализатор использует исходные символы для генерации потока токенов. Тип генерируемого токена обычно зависит от следующего исходного символа, который должен быть обработан. Аналогично, другое специальное поведение анализатора зависит от первого исходного символа, который ещё не был обработан. В следующей таблице приведён краткий обзор этих исходных символов со ссылками на разделы, содержащие дополнительную информацию.1415| Символ | Следующий токен (или соответствующая документация) |16| --- | --- |17| пробел табуляция прогон страницы | [Пробельные символы](https://python-all.ru/3/reference/lexical_analysis.html#whitespace) |18| CR, LF | [Новая строка](https://python-all.ru/3/reference/lexical_analysis.html#line-structure) [Отступ](https://python-all.ru/3/reference/lexical_analysis.html#indentation) |19| обратная косая черта (`\`) | [Явное объединение строк](https://python-all.ru/3/reference/lexical_analysis.html#explicit-joining) (Также имеет значение в [escape-последовательностях строк](https://python-all.ru/3/reference/lexical_analysis.html#escape-sequences)) |20| знак решётки (`#`) | [Комментарий](https://python-all.ru/3/reference/lexical_analysis.html#comments) |21| кавычка (`'`, `"`) | [Строковый литерал](https://python-all.ru/3/reference/lexical_analysis.html#strings) |22| буква ASCII (`a`-`z`, `A`-`Z`) не ASCII-символ | [Имя](https://python-all.ru/3/reference/lexical_analysis.html#identifiers) [Строковый литерал или литерал bytes с префиксом](https://python-all.ru/3/reference/lexical_analysis.html#strings) |23| символ подчёркивания (`_`) | [Имя](https://python-all.ru/3/reference/lexical_analysis.html#identifiers) (Также может быть частью [числовых литералов](https://python-all.ru/3/reference/lexical_analysis.html#numbers)) |24| цифра (`0`-`9`) | [Числовой литерал](https://python-all.ru/3/reference/lexical_analysis.html#numbers) |25| точка (`.`) | [Числовой литерал](https://python-all.ru/3/reference/lexical_analysis.html#numbers) [Оператор](https://python-all.ru/3/reference/lexical_analysis.html#operators) |26| вопросительный знак (`?`) доллар (`$`) обратный апостроф (`` ​`​ ``) управляющий символ | Ошибка (вне строковых литералов и комментариев) |27| другой печатный символ | [Оператор или разделитель](https://python-all.ru/3/reference/lexical_analysis.html#operators) |28| конец файла | [Маркер конца](https://python-all.ru/3/reference/lexical_analysis.html#endmarker-token) |2930## 2.1. Структура строки3132Программа на Python состоит из нескольких *логических строк*.3334### 2.1.1. Логические строки3536Конец логической строки обозначается токеном [`NEWLINE`](https://python-all.ru/3/library/token.html#token.NEWLINE). Инструкции не могут пересекать границы логических строк, кроме тех случаев, когда `NEWLINE` разрешено синтаксисом (например, между инструкциями в составных инструкциях). Логическая строка строится из одной или нескольких *физических строк* по правилам [явного](https://python-all.ru/3/reference/lexical_analysis.html#explicit-joining) или [неявного](https://python-all.ru/3/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/reference/lexical_analysis.html)’, использующая символ ASCII CR (возврат каретки).4546Независимо от платформы, каждая из этих последовательностей заменяется одним символом ASCII LF (перевод строки). (Это делается даже внутри [строковых литералов](https://python-all.ru/3/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/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/library/token.html#token.NEWLINE) не генерируется). При интерактивном вводе инструкций обработка пустой строки может отличаться в зависимости от реализации цикла чтения-вычисления-вывода. В стандартном интерактивном интерпретаторе полностью пустая логическая строка (то есть строка, не содержащая даже пробелов или комментария) завершает многострочную инструкцию.117118### 2.1.8. Отступы119120Начальные пробельные символы (пробелы и табуляции) в начале логической строки используются для вычисления уровня отступа строки, который, в свою очередь, используется для определения группировки инструкций.121122Символы табуляции заменяются (слева направо) на от одного до восьми пробелов так, чтобы общее количество символов до и включая замену было кратно восьми (это то же правило, что используется в Unix). Общее количество пробелов перед первым непробельным символом затем определяет отступ строки. Отступ нельзя разделить на несколько физических строк с помощью обратной косой черты; пробельные символы до первой обратной косой черты определяют отступ.123124Отступ считается недопустимым, если исходный файл смешивает табуляции и пробелы таким образом, что смысл зависит от того, какому количеству пробелов равна табуляция; в этом случае возбуждается [`TabError`](https://python-all.ru/3/library/exceptions.html#TabError).125126**Примечание о кроссплатформенной совместимости:** из-за особенностей текстовых редакторов на платформах, отличных от UNIX, не рекомендуется использовать смесь пробелов и табуляции для отступов в одном исходном файле. Также следует отметить, что разные платформы могут явно ограничивать максимальный уровень отступа.127128Символ перевода страницы может присутствовать в начале строки; он будет игнорироваться при вычислении отступа, описанном выше. Символы перевода страницы, встречающиеся в других местах начальных пробельных символов, имеют неопределённый эффект (например, они могут сбросить счётчик пробелов до нуля).129130Уровни отступов последовательных строк используются для генерации токенов [`INDENT`](https://python-all.ru/3/library/token.html#token.INDENT) и [`DEDENT`](https://python-all.ru/3/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/library/token.html#token.ENDMARKER).178179## 2.2. Прочие токены180181Помимо [`NEWLINE`](https://python-all.ru/3/library/token.html#token.NEWLINE), [`INDENT`](https://python-all.ru/3/library/token.html#token.INDENT) и [`DEDENT`](https://python-all.ru/3/library/token.html#token.DEDENT), существуют следующие категории токенов: *идентификаторы* и *ключевые слова* ([`NAME`](https://python-all.ru/3/library/token.html#token.NAME)), *литералы* (такие как [`NUMBER`](https://python-all.ru/3/library/token.html#token.NUMBER) и [`STRING`](https://python-all.ru/3/library/token.html#token.STRING)), а также другие символы (*операторы* и *разделители*, [`OP`](https://python-all.ru/3/library/token.html#token.OP)). Пробельные символы (за исключением терминаторов логических строк, рассмотренных ранее) не являются токенами, а служат для разделения токенов. При неоднозначности токен включает самую длинную возможную строку, образующую допустимый токен при чтении слева направо.182183## 2.3. Имена (идентификаторы и ключевые слова)184185Токены [`NAME`](https://python-all.ru/3/library/token.html#token.NAME) представляют *идентификаторы*, *ключевые слова* и *мягкие ключевые слова*.186187Имена состоят из следующих символов:188189- прописные и строчные буквы (`A-Z` и `a-z`),190- символ подчёркивания (`_`),191- цифры (от `0` до `9`), которые не могут быть первым символом, и192- не-ASCII символы. Допустимые имена могут содержать только «буквоподобные» и «цифроподобные» символы; подробности см. в разделе [Не-ASCII символы в именах](https://python-all.ru/3/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/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/reference/compound_stmts.html#match).229- `type` при использовании в инструкции [`type`](https://python-all.ru/3/reference/simple_stmts.html#type).230231Синтаксически они ведут себя как ключевые слова в своих контекстах, но это различие проводится на уровне синтаксического анализатора, а не при токенизации.232233Будучи мягкими ключевыми словами, их использование в грамматике возможно, при этом сохраняется совместимость с существующим кодом, который использует эти имена как имена идентификаторов.234235Изменено в версии 3.12: `type` теперь является мягким ключевым словом.236237### 2.3.3. Зарезервированные классы идентификаторов238239Некоторые классы идентификаторов (помимо ключевых слов) имеют специальное значение. Эти классы определяются по шаблонам ведущих и завершающих символов подчёркивания:240241**`_*`**242243Не импортируется инструкцией `from module import *`.244245**`_`**246247В шаблоне `case` внутри инструкции [`match`](https://python-all.ru/3/reference/compound_stmts.html#match) `_` является [мягким ключевым словом](https://python-all.ru/3/reference/lexical_analysis.html#soft-keywords), которое обозначает [шаблонный символ (wildcard)](https://python-all.ru/3/reference/compound_stmts.html#wildcard-patterns).248249Отдельно, интерактивный интерпретатор делает результат последнего вычисления доступным в переменной `_`. (Он хранится в модуле [`builtins`](https://python-all.ru/3/library/builtins.html#module-builtins) вместе со встроенными функциями, такими как `print`.)250251В других контекстах `_` – это обычный идентификатор. Его часто используют для именования «особых» элементов, но для самого Python он не является специальным.252253> **Примечание**254>255> Имя `_` часто используется в связи с интернационализацией; обратитесь к документации модуля [`gettext`](https://python-all.ru/3/library/gettext.html#module-gettext) для получения дополнительной информации об этом соглашении.256>257> Оно также часто используется для неиспользуемых переменных.258259**`__*__`**260261Системные имена, неформально известные как «dunder»-имена. Эти имена определяются интерпретатором и его реализацией (включая стандартную библиотеку). Текущие системные имена обсуждаются в разделе [Специальные имена методов](https://python-all.ru/3/reference/datamodel.html#specialnames) и в других местах. Вероятно, в будущих версиях Python будут определены новые. *Любое* использование `__*__` имён, в любом контексте, не соответствующее явно документированному использованию, может быть нарушено без предупреждения.262263**`__*`**264265Приватные имена классов. Имена этой категории при использовании в контексте определения класса переписываются в искажённую форму, чтобы избежать конфликтов имён между «приватными» атрибутами базовых и производных классов. См. раздел [Идентификаторы (имена)](https://python-all.ru/3/reference/expressions.html#atom-identifiers).266267### 2.3.4. Не-ASCII символы в именах268269Имена, содержащие не-ASCII символы, требуют дополнительной нормализации и проверки, помимо правил и грамматики, описанных [выше](https://python-all.ru/3/reference/lexical_analysis.html#identifiers). Например, `ř_1`, `蛇` или `साँप` являются допустимыми именами, а `r〰2`, `€` или `🐍` – нет.270271В этом разделе объясняются точные правила.272273Все имена при синтаксическом анализе преобразуются в [форму нормализации](https://python-all.ru/3/reference/lexical_analysis.html) NFKC. Это означает, что, например, некоторые типографские варианты символов преобразуются в свою «базовую» форму. Например, `fiⁿₐˡᵢᶻₐᵗᵢᵒₙ` нормализуется в `finalization`, поэтому Python считает их одним и тем же именем:274275```python276>>> fiⁿₐˡᵢᶻₐᵗᵢᵒₙ = 3277>>> finalization2783279```280281> **Примечание**282>283> Нормализация выполняется только на лексическом уровне. Функции времени выполнения, которые принимают имена в виде *строк*, обычно не нормализуют свои аргументы. Например, определённая выше переменная доступна во время выполнения в словаре [`globals()`](https://python-all.ru/3/library/functions.html#globals) как `globals()["finalization"]`, но не как `globals()["fiⁿₐˡᵢᶻₐᵗᵢᵒₙ"]`.284285Аналогично тому, как имена, состоящие только из ASCII, должны содержать только буквы, цифры и символ подчёркивания и не могут начинаться с цифры, допустимое имя должно начинаться с символа из «буквоподобного» набора `xid_start`, а остальные символы должны быть из «букво- и цифроподобного» набора `xid_continue`.286287Эти наборы основаны на множествах *XID\_Start* и *XID\_Continue*, определённых в приложении к стандарту Unicode [UAX-31](https://python-all.ru/3/reference/lexical_analysis.html). Python’s `xid_start` дополнительно включает символ подчёркивания (`_`). Обратите внимание, что Python не обязательно соответствует [UAX-31](https://python-all.ru/3/reference/lexical_analysis.html).288289Неформальный перечень символов из множеств *XID\_Start* и *XID\_Continue*, определённых в стандарте Unicode, доступен в файле [DerivedCoreProperties.txt](https://python-all.ru/3/reference/lexical_analysis.html) в базе данных символов Unicode. Для справки, правила построения наборов `xid_*` приведены ниже.290291Множество `id_start` определяется как объединение:292293- Категория Unicode `<Lu>` – прописные буквы (включает `A``Z`)294- Категория Unicode `<Ll>` – строчные буквы (включает `a``z`)295- Категория Unicode `<Lt>` – буквы заглавного регистра296- Категория Unicode `<Lm>` – модифицирующие буквы297- Категория Unicode `<Lo>` – прочие буквы298- Категория Unicode `<Nl>` – буквенные числа299- {`"_"`} – символ подчёркивания300- `<Other_ID_Start>` – явный набор символов из [PropList.txt](https://python-all.ru/3/reference/lexical_analysis.html) для поддержки обратной совместимости301302Множество `xid_start` затем замыкает это множество относительно нормализации NFKC, удаляя все символы, чья нормализация не имеет вида `id_start id_continue*`.303304Множество `id_continue` определяется как объединение:305306- `id_start` (см. выше)307- Категория Unicode `<Nd>` – десятичные числа (включает `0``9`)308- Категория Unicode `<Pc>` – соединительные знаки пунктуации309- Категория Unicode `<Mn>` – некомбинируемые знаки310- Категория Unicode `<Mc>` – комбинируемые знаки с увеличением ширины311- `<Other_ID_Continue>` – ещё один явный набор символов из [PropList.txt](https://python-all.ru/3/reference/lexical_analysis.html) для поддержки обратной совместимости312313Снова `xid_continue` замыкает это множество относительно нормализации NFKC.314315Категории Unicode используют версию базы данных символов Unicode, включённую в модуль [`unicodedata`](https://python-all.ru/3/library/unicodedata.html#module-unicodedata).316317> **См. также**318>319> - [**PEP 3131**](https://python-all.ru/3/reference/lexical_analysis.html) – Поддержка не-ASCII идентификаторов320> - [**PEP 672**](https://python-all.ru/3/reference/lexical_analysis.html) – Соображения безопасности, связанные с Unicode, для Python321322## 2.4. Литералы323324Литералы – это обозначения константных значений некоторых встроенных типов.325326С точки зрения лексического анализа, Python имеет [string, bytes](https://python-all.ru/3/reference/lexical_analysis.html#strings) и [numeric](https://python-all.ru/3/reference/lexical_analysis.html#numbers) литералы.327328Другие «литералы» лексически обозначаются с помощью [ключевых слов](https://python-all.ru/3/reference/lexical_analysis.html#keywords) (`None`, `True`, `False`) и специального [токена многоточия](https://python-all.ru/3/reference/lexical_analysis.html#lexical-ellipsis) (`...`).329330## 2.5. Строковые литералы и литералы байтов331332Строковые литералы – это текст, заключённый в одинарные (`'`) или двойные кавычки (`"`). Например:333334```python335"spam"336'eggs'337```338339Кавычка, открывающая литерал, также и закрывает его, поэтому строковый литерал может содержать только другую кавычку (за исключением управляющих последовательностей, см. ниже). Например:340341```python342'Say "Hello", please.'343"Don't do that!"344```345346За исключением этого ограничения, выбор символа кавычки (`'` или `"`) не влияет на то, как разбирается литерал.347348Внутри строкового литерала символ обратной косой черты (`\`) вводит *управляющую последовательность*, имеющую специальное значение в зависимости от символа после обратной косой черты. Например, `\"` обозначает символ двойной кавычки и *не* завершает строку:349350```pycon351>>> print("Say \"Hello\" to everyone!")352Say "Hello" to everyone!353```354355См. [управляющие последовательности](https://python-all.ru/3/reference/lexical_analysis.html#escape-sequences) ниже для полного списка таких последовательностей и дополнительных подробностей.356357### 2.5.1. Строки в тройных кавычках358359Строки также могут быть заключены в соответствующие группы из трёх одинарных или двойных кавычек. Их обычно называют *строками с тройными кавычками*:360361```python362"""Это строка в тройных кавычках."""363```364365В литералах с тройными кавычками допускаются неэкранированные кавычки (и они сохраняются), за исключением того, что три неэкранированные кавычки подряд завершают литерал, если они того же типа (`'` или `"`), что использовались в начале:366367```python368"""В этой строке есть "кавычки" внутри."""369```370371Неэкранированные символы новой строки также допускаются и сохраняются:372373```python374'''Эта строка в тройных кавычках375продолжается на следующей строке.'''376```377378### 2.5.2. Префиксы строк379380Строковые литералы могут иметь необязательный *префикс*, который влияет на то, как разбирается содержимое литерала, например:381382```python383b"data"384f'{result=}'385```386387Допустимые префиксы:388389- `b`: [Литерал байтов](https://python-all.ru/3/reference/lexical_analysis.html#bytes-literal)390- `r`: [Сырая строка](https://python-all.ru/3/reference/lexical_analysis.html#raw-strings)391- `f`: [Форматированный строковый литерал](https://python-all.ru/3/reference/lexical_analysis.html#f-strings) («f-строка»)392- `t`: [Шаблонный строковый литерал](https://python-all.ru/3/reference/lexical_analysis.html#t-strings) («t-строка»)393- `u`: Нет эффекта (допускается для обратной совместимости)394395Подробнее о каждом типе см. в соответствующих разделах по ссылкам.396397Префиксы нечувствительны к регистру (например, «`B`» работает так же, как «`b`»). Префикс «`r`» можно комбинировать с «`f`», «`t`» или «`b`», так что «`fr`», «`rf`», «`tr`», «`rt`», «`br`» и «`rb`» также являются допустимыми префиксами.398399Добавлено в версии 3.3: Префикс `'rb'` для сырых байтовых литералов был добавлен как синоним `'br'`.400401Поддержка устаревшего литерала Unicode (`u'value'`) была восстановлена, чтобы упростить поддержку кодовых баз, работающих одновременно на Python 2.x и 3.x. Подробнее см. [**PEP 414**](https://python-all.ru/3/reference/lexical_analysis.html).402403### 2.5.3. Формальная грамматика404405Строковые литералы, за исключением [«f-строк»](https://python-all.ru/3/reference/lexical_analysis.html#f-strings) и [«t-строк»](https://python-all.ru/3/reference/lexical_analysis.html#t-strings), описываются следующими лексическими определениями.406407В этих определениях используются [отрицательные опережающие проверки](https://python-all.ru/3/reference/introduction.html#lexical-lookaheads) (`!`), чтобы указать, что конечная кавычка завершает литерал.408409```410411STRING:          [stringprefix] (stringcontent)412stringprefix:    <("r" | "u" | "b" | "br" | "rb"), case-insensitive>413stringcontent:414   | "'''" ( !"'''" longstringitem)* "'''"415   | '"""' ( !'"""' longstringitem)* '"""'416   | "'" ( !"'" stringitem)* "'"417   | '"' ( !'"' stringitem)* '"'418stringitem:      stringchar | stringescapeseq419stringchar:      <any source_character, except backslash and newline>420longstringitem:  stringitem | newline421stringescapeseq: "\" <any source_character>422```423424Обратите внимание, что, как и во всех лексических определениях, пробельные символы значимы. В частности, префикс (если он есть) должен непосредственно предшествовать открывающей кавычке.425426### 2.5.4. Escape-последовательности427428Если не указан префикс «`r`» или «`R`», escape-последовательности в строковых и байтовых литералах интерпретируются по правилам, аналогичным используемым в стандартном C. Распознаваемые escape-последовательности:429430| Escape-последовательность | Значение |431| --- | --- |432| `\`\<новая строка\> | [Игнорируемый конец строки](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-ignore) |433| `\\` | [Обратная косая черта](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-escaped-char) |434| `\'` | [Одинарная кавычка](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-escaped-char) |435| `\"` | [Двойная кавычка](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-escaped-char) |436| `\a` | ASCII Bell (BEL) |437| `\b` | ASCII Backspace (BS) |438| `\f` | ASCII Formfeed (FF) |439| `\n` | ASCII Linefeed (LF) |440| `\r` | ASCII Carriage Return (CR) |441| `\t` | ASCII горизонтальная табуляция (TAB) |442| `\v` | ASCII вертикальная табуляция (VT) |443| `\ooo` | [восьмеричный символ](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-oct) |444| `\xhh` | [шестнадцатеричный символ](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-hex) |445| `\N{name}` | [именованный символ Unicode](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-named) |446| `\uxxxx` | [шестнадцатеричный символ Unicode](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-long-hex) |447| `\Uxxxxxxxx` | [шестнадцатеричный символ Unicode](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-long-hex) |448449#### 2.5.4.1. Игнорируемый конец строки450451Обратную косую черту можно добавить в конце строки, чтобы игнорировать символ новой строки:452453```python454>>> 'This string will not include \455... backslashes or newline characters.'456'This string will not include backslashes or newline characters.'457```458459Того же результата можно достичь с помощью [строк в тройных кавычках](https://python-all.ru/3/reference/lexical_analysis.html#strings), или круглых скобок и [конкатенации строковых литералов](https://python-all.ru/3/reference/expressions.html#string-concatenation).460461#### 2.5.4.2. Экранированные символы462463Чтобы включить обратную косую черту в [необработанный](https://python-all.ru/3/reference/lexical_analysis.html#raw-strings) строковый литерал Python, её нужно удвоить. Управляющая последовательность `\\` обозначает один символ обратной косой черты:464465```python466>>> print('C:\\Program Files')467C:\Program Files468```469470Аналогично, последовательности `\'` и `\"` обозначают символы одинарной и двойной кавычки соответственно:471472```python473>>> print('\' and \"')474' and "475```476477#### 2.5.4.3. Восьмеричный символ478479Последовательность `\ooo` обозначает *символ* с восьмеричным (основание 8) значением *ooo*:480481```python482>>> '\120'483'P'484```485486Допускается до трёх восьмеричных цифр (от 0 до 7).487488В литерале bytes *символ* означает *байт* с заданным значением. В строковом литерале он означает символ Unicode с заданным значением.489490Изменено в версии 3.11: Восьмеричные управляющие последовательности со значением больше `0o377` (255) вызывают [`DeprecationWarning`](https://python-all.ru/3/library/exceptions.html#DeprecationWarning).491492Изменено в версии 3.12: Восьмеричные управляющие последовательности со значением больше `0o377` (255) вызывают [`SyntaxWarning`](https://python-all.ru/3/library/exceptions.html#SyntaxWarning). В будущей версии Python они будут вызывать [`SyntaxError`](https://python-all.ru/3/library/exceptions.html#SyntaxError).493494#### 2.5.4.4. Шестнадцатеричный символ495496Последовательность `\xhh` обозначает *символ* с шестнадцатеричным (основание 16) значением *hh*:497498```python499>>> '\x50'500'P'501```502503В отличие от стандартного C, требуется ровно две шестнадцатеричные цифры.504505В литерале bytes *символ* означает *байт* с заданным значением. В строковом литерале он означает символ Unicode с заданным значением.506507#### 2.5.4.5. Именованный символ Unicode508509Последовательность `\N{name}` обозначает символ Unicode с заданным *именем*:510511```python512>>> '\N{LATIN CAPITAL LETTER P}'513'P'514>>> '\N{SNAKE}'515'🐍'516```517518Эта последовательность не может появляться в [литералах bytes](https://python-all.ru/3/reference/lexical_analysis.html#bytes-literal).519520Изменено в версии 3.3: Добавлена поддержка [псевдонимов имён](https://python-all.ru/3/reference/lexical_analysis.html) .521522#### 2.5.4.6. Шестнадцатеричные символы Unicode523524Эти последовательности `\uxxxx` и `\Uxxxxxxxx` обозначают символ Unicode с заданным шестнадцатеричным (основание 16) значением. Для `\u` требуется ровно четыре цифры; для `\U` требуется ровно восемь цифр. Последняя может кодировать любой символ Unicode.525526```pycon527>>> '\u1234'528'ሴ'529>>> '\U0001f40d'530'🐍'531```532533Эти последовательности не могут появляться в [литералах bytes](https://python-all.ru/3/reference/lexical_analysis.html#bytes-literal).534535#### 2.5.4.7. Неизвестные escape-последовательности536537В отличие от стандартного C, все неизвестные escape-последовательности остаются в строке без изменений, то есть *обратная косая черта сохраняется в результате*:538539```python540>>> print('\q')541\q542>>> list('\q')543['\\', 'q']544```545546Обратите внимание: для байтовых литералов escape-последовательности, распознаваемые только в строковых литералах (`\N...`, `\u...`, `\U...`), относятся к категории нераспознанных escape-последовательностей.547548Изменено в версии 3.6: Нераспознанные escape-последовательности приводят к появлению [`DeprecationWarning`](https://python-all.ru/3/library/exceptions.html#DeprecationWarning).549550Изменено в версии 3.12: Нераспознанные escape-последовательности приводят к появлению [`SyntaxWarning`](https://python-all.ru/3/library/exceptions.html#SyntaxWarning). В будущей версии Python они будут вызывать [`SyntaxError`](https://python-all.ru/3/library/exceptions.html#SyntaxError).551552### 2.5.5. Байтовые литералы553554*Байтовые литералы* всегда имеют префикс '`b`' или '`B`'; они создают экземпляр типа [`bytes`](https://python-all.ru/3/library/stdtypes.html#bytes) вместо типа [`str`](https://python-all.ru/3/library/stdtypes.html#str). Они могут содержать только символы ASCII; байты со значением 128 или больше должны быть представлены с помощью escape-последовательностей (обычно [шестнадцатеричный символ](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-hex) или [восьмеричный символ](https://python-all.ru/3/reference/lexical_analysis.html#string-escape-oct)):555556```pycon557>>> b'\x89PNG\r\n\x1a\n'558b'\x89PNG\r\n\x1a\n'559>>> list(b'\x89PNG\r\n\x1a\n')560[137, 80, 78, 71, 13, 10, 26, 10]561```562563Аналогично, нулевой байт должен быть выражен с помощью escape-последовательности (обычно `\0` или `\x00`).564565### 2.5.6. Сырые строковые литералы566567Как строковые, так и байтовые литералы могут по желанию иметь префикс '`r`' или '`R`'; такие конструкции называются *сырыми строковыми литералами* и *сырыми байтовыми литералами* соответственно и обрабатывают обратную косую черту как буквенный символ. В результате в сырых строковых литералах [escape-последовательности](https://python-all.ru/3/reference/lexical_analysis.html#escape-sequences) не обрабатываются особым образом:568569```pycon570>>> r'\d{4}-\d{2}-\d{2}'571'\\d{4}-\\d{2}-\\d{2}'572```573574Даже в сыром литерале кавычки можно экранировать обратной косой чертой, но обратная косая черта остаётся в результате; например, `r"\""` – это допустимый строковый литерал, состоящий из двух символов: обратной косой черты и двойной кавычки; `r"\"` – это недопустимый строковый литерал (даже сырая строка не может заканчиваться нечётным количеством обратных косых черт). В частности, *сырой литерал не может заканчиваться одной обратной косой чертой* (поскольку обратная косая черта экранировала бы следующий символ кавычки). Также обратите внимание, что одиночная обратная косая черта, за которой следует новая строка, интерпретируется как эти два символа в составе литерала, *а не* как продолжение строки.575576### 2.5.7. f-строки577578Добавлено в версии 3.6.579580Изменено в версии 3.7: В выражениях внутри f-строк теперь можно использовать [`await`](https://python-all.ru/3/reference/expressions.html#await) и [`async for`](https://python-all.ru/3/reference/compound_stmts.html#async-for).581582Изменено в версии 3.8: Добавлен спецификатор отладки (`=`)583584Изменено в версии 3.12: Снято множество ограничений на выражения внутри f-строк. В частности, теперь разрешены вложенные строки, комментарии и обратные косые черты.585586*Форматированный строковый литерал* или *f-строка* – это строковый литерал с префиксом '`f`' или '`F`'. В отличие от других строковых литералов, f-строки не имеют постоянного значения. Они могут содержать *поля подстановки*, ограниченные фигурными скобками `{}`. Поля подстановки содержат выражения, которые вычисляются во время выполнения. Например:587588```python589>>> who = 'nobody'590>>> nationality = 'Spanish'591>>> f'{who.title()} expects the {nationality} Inquisition!'592'Nobody expects the Spanish Inquisition!'593```594595Любые удвоенные фигурные скобки (`{{` или `}}`) вне полей подстановки заменяются соответствующей одинарной фигурной скобкой:596597```python598>>> print(f'{{...}}')599{...}600```601602Другие символы вне полей подстановки обрабатываются как в обычных строковых литералах. Это означает, что escape-последовательности декодируются (за исключением случаев, когда литерал также помечен как сырая строка), и в f-строках с тройными кавычками возможны новые строки:603604```python605>>> name = 'Galahad'606>>> favorite_color = 'blue'607>>> print(f'{name}:\t{favorite_color}')608Galahad:       blue609>>> print(rf"C:\Users\{name}")610C:\Users\Galahad611>>> print(f'''Three shall be the number of the counting612... and the number of the counting shall be three.''')613Three shall be the number of the counting614and the number of the counting shall be three.615```616617Выражения в форматированных строковых литералах обрабатываются как обычные выражения Python. Каждое выражение вычисляется в контексте, где появляется форматированный строковый литерал, слева направо. Пустое выражение не допускается, и как [`lambda`](https://python-all.ru/3/reference/expressions.html#lambda), так и выражения присваивания `:=` должны быть окружены явными круглыми скобками:618619```python620>>> f'{(half := 1/2)}, {half * 42}'621'0.5, 21.0'622```623624Повторное использование типа кавычек внешней f-строки внутри поля подстановки разрешено:625626```python627>>> a = dict(x=2)628>>> f"abc {a["x"]} def"629'abc 2 def'630```631632Обратные косые черты также допускаются в полях подстановки и вычисляются так же, как в любом другом контексте:633634```python635>>> a = ["a", "b", "c"]636>>> print(f"List a contains:\n{"\n".join(a)}")637List a contains:638a639b640c641```642643Возможно вложение f-строк:644645```python646>>> name = 'world'647>>> f'Repeated:{f' hello {name}' * 3}'648'Repeated: hello world hello world hello world'649```650651Переносимые программы на Python не должны использовать более 5 уровней вложенности.652653**Особенность реализации CPython:** CPython не ограничивает вложенность f-строк.654655Выражения подстановки могут содержать новые строки как в f-строках с одинарными кавычками, так и с тройными, и они могут содержать комментарии. Всё, что следует после `#` внутри поля подстановки, является комментарием (даже закрывающие скобки и кавычки). Это означает, что поля подстановки с комментариями должны быть закрыты на другой строке:656657```text658>>> a = 2659>>> f"abc{a  # This comment  }"  continues until the end of the line660...       + 3}"661'abc5'662```663664После выражения поля подстановки могут по желанию содержать:665666- *спецификатор отладки* – знак равенства (`=`), по желанию окружённый пробелами с одной или обеих сторон;667- *спецификатор преобразования*`!s`, `!r` или `!a`; и/или668- *спецификатор формата* с префиксом в виде двоеточия (`:`).669670См. [раздел «f-строки» в стандартной библиотеке](https://python-all.ru/3/library/stdtypes.html#stdtypes-fstrings) для подробностей о том, как вычисляются эти поля.671672Как объясняется в этом разделе, *спецификаторы формата* передаются вторым аргументом функции [`format()`](https://python-all.ru/3/library/functions.html#format) для форматирования значения поля подстановки. Например, их можно использовать для указания ширины поля и символов заполнения с помощью [миниязыка спецификации формата](https://python-all.ru/3/library/string.html#formatspec):673674```python675>>> number = 14.3676>>> f'{number:20.7f}'677'          14.3000000'678```679680Спецификаторы формата верхнего уровня могут включать вложенные поля подстановки:681682```python683>>> field_size = 20684>>> precision = 7685>>> f'{number:{field_size}.{precision}f}'686'          14.3000000'687```688689Эти вложенные поля могут включать собственные поля преобразования и [спецификаторы формата](https://python-all.ru/3/library/string.html#formatspec):690691```python692>>> number = 3693>>> f'{number:{field_size}}'694'                   3'695>>> f'{number:{field_size:05}}'696'00000000000000000003'697```698699Однако эти вложенные поля не могут включать более глубоко вложенные поля подстановки.700701Форматированные строковые литералы не могут использоваться в качестве [строк документации](https://python-all.ru/3/glossary.html#term-docstring), даже если они не содержат выражений:702703```python704>>> def foo():705...     f"Not a docstring"706...707>>> print(foo.__doc__)708None709```710711> **См. также**712>713> - [**PEP 498**](https://python-all.ru/3/reference/lexical_analysis.html) – Интерполяция строковых литералов714> - [**PEP 701**](https://python-all.ru/3/reference/lexical_analysis.html) – Синтаксическая формализация f-строк715> - [`str.format()`](https://python-all.ru/3/library/stdtypes.html#str.format), в котором используется связанный механизм строк форматирования.716717### 2.5.8. t-строки718719Добавлено в версии 3.14.720721*Шаблонный строковый литерал* или *t-строка* – это строковый литерал с префиксом ‘`t`’ или ‘`T`’. Такие строки подчиняются тем же правилам синтаксиса, что и [f-строки (форматированные строковые литералы)](https://python-all.ru/3/reference/lexical_analysis.html#f-strings). Об отличиях в правилах вычисления см. [раздел о t-строках в стандартной библиотеке](https://python-all.ru/3/library/stdtypes.html#stdtypes-tstrings)722723### 2.5.9. Формальная грамматика f-строк724725F-строки обрабатываются частично [лексическим анализатором](https://python-all.ru/3/glossary.html#term-lexical-analyzer), который генерирует токены [`FSTRING_START`](https://python-all.ru/3/library/token.html#token.FSTRING_START), [`FSTRING_MIDDLE`](https://python-all.ru/3/library/token.html#token.FSTRING_MIDDLE) и [`FSTRING_END`](https://python-all.ru/3/library/token.html#token.FSTRING_END), а частично – парсером, который обрабатывает выражения в поле подстановки. Точное распределение работы зависит от реализации CPython.726727Соответственно, грамматика f-строк представляет собой смесь [лексических и синтаксических определений](https://python-all.ru/3/reference/introduction.html#notation-lexical-vs-syntactic).728729Пробельные символы значимы в следующих ситуациях:730731- В [`FSTRING_START`](https://python-all.ru/3/library/token.html#token.FSTRING_START) не должно быть пробелов (между префиксом и кавычкой).732- Пробелы в [`FSTRING_MIDDLE`](https://python-all.ru/3/library/token.html#token.FSTRING_MIDDLE) являются частью содержимого строкового литерала.733- В `fstring_replacement_field`, если присутствует `f_debug_specifier`, все пробелы после открывающей фигурной скобки до `f_debug_specifier`, а также пробелы, следующие непосредственно за `f_debug_specifier`, сохраняются как часть выражения.734735  **Деталь реализации CPython:** Выражение не обрабатывается на этапе токенизации; оно извлекается из исходного кода с использованием позиций токена `{` и токена после `=`.736737Определение `FSTRING_MIDDLE` использует [отрицательные опережающие проверки](https://python-all.ru/3/reference/introduction.html#lexical-lookaheads) (`!`) для обозначения специальных символов (обратная косая черта, новая строка, `{`, `}`) и последовательностей (`f_quote`).738739```740741fstring:    FSTRING_START fstring_middle* FSTRING_END742743FSTRING_START:      fstringprefix ("'" | '"' | "'''" | '"""')744FSTRING_END:        f_quote745fstringprefix:      <("f" | "fr" | "rf"), case-insensitive>746f_debug_specifier:  '='747f_quote:            <the quote character(s) used in FSTRING_START>748749fstring_middle:750   | fstring_replacement_field751   | FSTRING_MIDDLE752FSTRING_MIDDLE:753   | (!"\" !newline !'{' !'}' !f_quote) source_character754   | stringescapeseq755   | "{{"756   | "}}"757   | <newline, in triple-quoted f-strings only>758fstring_replacement_field:759   | '{' f_expression [f_debug_specifier] [fstring_conversion]760         [fstring_full_format_spec] '}'761fstring_conversion:762   | "!" ("s" | "r" | "a")763fstring_full_format_spec:764   | ':' fstring_format_spec*765fstring_format_spec:766   | FSTRING_MIDDLE767   | fstring_replacement_field768f_expression:769   | ','.(conditional_expression | "*" or_expr)+ [","]770   | yield_expression771```772773> **Примечание**774>775> В приведённом фрагменте грамматики правила `f_quote` и `FSTRING_MIDDLE` являются контекстно-зависимыми – они зависят от содержимого `FSTRING_START` ближайшего окружающего `fstring`.776>777> Построение более традиционной формальной грамматики из этого шаблона оставляется читателю в качестве упражнения.778779Грамматика t-строк идентична грамматике f-строк, с заменой *t* на *f* в начале имён правил и токенов, а также в префиксе.780781```782783tstring:    TSTRING_START tstring_middle* TSTRING_END784785<rest of the t-string grammar is omitted; see above>786```787788## 2.6. Числовые литералы789790Токены [`NUMBER`](https://python-all.ru/3/library/token.html#token.NUMBER) представляют числовые литералы, которые бывают трёх типов: целые числа, числа с плавающей точкой и мнимые числа.791792```793794NUMBER: integer | floatnumber | imagnumber795```796797Числовое значение числового литерала совпадает со значением, которое получилось бы при передаче строки конструктору класса [`int`](https://python-all.ru/3/library/functions.html#int), [`float`](https://python-all.ru/3/library/functions.html#float) или [`complex`](https://python-all.ru/3/library/functions.html#complex) соответственно. Обратите внимание, что не все допустимые входные данные для этих конструкторов являются литералами.798799Числовые литералы не включают знак; выражение вроде `-1` – это на самом деле выражение, состоящее из унарного оператора ‘`-`’ и литерала `1`.800801### 2.6.1. Целочисленные литералы802803Целочисленные литералы обозначают целые числа. Например:804805```python806780738082147483647809```810811Длина целочисленных литералов не ограничена ничем, кроме доступной памяти:812813```python8147922816251426433759354395033679228162514264337593543950336815```816817Символы подчёркивания можно использовать для группировки цифр для улучшения читаемости; они игнорируются при определении числового значения литерала. Например, следующие литералы эквивалентны:818819```python820100_000_000_0008211000000000008221_00_00_00_00_000823```824825Символы подчёркивания могут находиться только между цифрами. Например, `_123`, `321_` и `123__321` *не* являются допустимыми литералами.826827Целые числа могут быть заданы в двоичной (основание 2), восьмеричной (основание 8) или шестнадцатеричной (основание 16) системе с помощью префиксов `0b`, `0o` и `0x` соответственно. Шестнадцатеричные цифры от 10 до 15 обозначаются буквами от `A` до `F` без учёта регистра. Например:828829```python8300b1001101118310b_1110_01018320o1778330o3778340xdeadbeef8350xDead_Beef836```837838Символ подчёркивания может следовать за указателем основания. Например, `0x_1f` – допустимый литерал, а `0_x1f` и `0x__1f` – нет.839840Ведущие нули в ненулевом десятичном числе не допускаются. Например, `0123` не является допустимым литералом. Это сделано для устранения неоднозначности с восьмеричными литералами в стиле C, которые Python использовал до версии 3.0.841842Формально целочисленные литералы описываются следующими лексическими определениями:843844```845846integer:      decinteger | bininteger | octinteger | hexinteger | zerointeger847decinteger:   nonzerodigit (["_"] digit)*848bininteger:   "0" ("b" | "B") (["_"] bindigit)+849octinteger:   "0" ("o" | "O") (["_"] octdigit)+850hexinteger:   "0" ("x" | "X") (["_"] hexdigit)+851zerointeger:  "0"+ (["_"] "0")*852nonzerodigit: "1"..."9"853digit:        "0"..."9"854bindigit:     "0" | "1"855octdigit:     "0"..."7"856hexdigit:     digit | "a"..."f" | "A"..."F"857```858859Изменено в версии 3.6: Теперь в литералах допускается использование символов подчёркивания для группировки.860861### 2.6.2. Литералы с плавающей точкой862863Литералы с плавающей точкой (float), такие как `3.14` или `1.5`, обозначают [приближения вещественных чисел](https://python-all.ru/3/reference/datamodel.html#datamodel-float).864865Они состоят из *целой* и *дробной* частей, каждая из которых состоит из десятичных цифр. Части разделяются десятичной точкой `.`:866867```python8682.718288694.0870```871872В отличие от целочисленных литералов, ведущие нули допускаются. Например, `077.010` допустимо и обозначает то же число, что и `77.01`.873874Как и в целочисленных литералах, одиночные символы подчёркивания могут встречаться между цифрами для улучшения читаемости:875876```python87796_485.332_1238783.14_15_93879```880881Любая из этих частей, но не обе, может быть пустой. Например:882883```python88410.  # (эквивалентно 10.0)885.001  # (эквивалентно 0.001)886```887888Целая и дробная части могут дополнительно сопровождаться *экспонентой*: буква `e` или `E`, после которой может идти знак (`+` или `-`), а затем число, записанное в том же формате, что и целая с дробной частями. `e` или `E` означает «умножить на десять в степени»:889890```python8911.0e3  # (представляет 1.0×10³, или 1000.0)8921.166e-5  # (представляет 1.166×10⁻⁵, или 0.00001166)8936.02214076e+23  # (представляет 6.02214076×10²³, или 602214076000000000000000.)894```895896В числах с плавающей точкой, содержащих только целую часть и экспоненту, десятичную точку можно опускать:897898```python8991e3  # (эквивалентно 1.e3 и 1.0e3)9000e0  # (эквивалентно 0.)901```902903Формально литералы с плавающей точкой описываются следующими лексическими определениями:904905```906907floatnumber:908   | digitpart "." [digitpart] [exponent]909   | "." digitpart [exponent]910   | digitpart exponent911digitpart: digit (["_"] digit)*912exponent:  ("e" | "E") ["+" | "-"] digitpart913```914915Изменено в версии 3.6: В литералах теперь разрешены символы подчёркивания для группировки.916917### 2.6.3. Мнимые литералы918919В Python есть объекты [комплексных чисел](https://python-all.ru/3/library/stdtypes.html#typesnumeric), но нет комплексных литералов. Вместо этого *мнимые литералы* обозначают комплексные числа с нулевой действительной частью.920921Например, в математике комплексное число 3+4.2*i* записывается как действительное число 3, сложенное с мнимым числом 4.2*i*. Python использует похожий синтаксис, только мнимая единица записывается как `j` а не как *i*:922923```python9243+4.2j925```926927Это выражение состоит из [целочисленного литерала](https://python-all.ru/3/reference/lexical_analysis.html#integers) `3`, [оператора](https://python-all.ru/3/reference/lexical_analysis.html#operators) ‘`+`’ и [мнимого литерала](https://python-all.ru/3/reference/lexical_analysis.html#imaginary) `4.2j`. Поскольку это три отдельных токена, между ними допускаются пробелы:928929```python9303 + 4.2j931```932933Пробелы *внутри* каждого токена не допускаются. В частности, суффикс `j` не должен отделяться от числа, перед которым он стоит.934935Число перед `j` имеет тот же синтаксис, что и литерал с плавающей точкой. Таким образом, следующие мнимые литералы допустимы:936937```python9384.2j9393.14j94010.j941.001j9421e100j9433.14e-10j9443.14_15_93j945```946947В отличие от литерала с плавающей точкой, десятичную точку можно опустить, если мнимое число имеет только целую часть. Число по-прежнему вычисляется как число с плавающей точкой, а не как целое:948949```python95010j9510j9521000000000000000000000000j   # эквивалентно 1e+24j953```954955Суффикс `j` не чувствителен к регистру. То есть вместо него можно использовать `J`:956957```python9583.14J   # эквивалентно 3.14j959```960961Формально мнимые литералы описываются следующим лексическим определением:962963```964965imagnumber: (floatnumber | digitpart) ("j" | "J")966```967968## 2.7. Операторы и разделители969970Следующая грамматика определяет токены *операторов* и *разделителей*, то есть общий тип токенов [`OP`](https://python-all.ru/3/library/token.html#token.OP). [Список этих токенов и их названий](https://python-all.ru/3/library/token.html#token-operators-delimiters) также доступен в документации модуля `token`.971972```973974OP:975   | assignment_operator976   | bitwise_operator977   | comparison_operator978   | enclosing_delimiter979   | other_delimiter980   | arithmetic_operator981   | "..."982   | other_op983984assignment_operator:   "+=" | "-=" | "*=" | "**=" | "/="  | "//=" | "%=" |985                       "&=" | "|=" | "^=" | "<<=" | ">>=" | "@="  | ":="986bitwise_operator:      "&"  | "|"  | "^"  | "~"   | "<<"  | ">>"987comparison_operator:   "<=" | ">=" | "<"  | ">"   | "=="  | "!="988enclosing_delimiter:   "("  | ")"  | "["  | "]"   | "{"   | "}"989other_delimiter:       ","  | ":"  | "!"  | ";"   | "="   | "->"990arithmetic_operator:   "+"  | "-"  | "**" | "*"   | "//"  | "/"   | "%"991other_op:              "."  | "@"992```993994> **Примечание**995>996> Обычно *операторы* используются для комбинирования [выражений](https://python-all.ru/3/reference/expressions.html#expressions), тогда как *разделители* служат другим целям. Однако чёткого формального разграничения между этими двумя категориями нет.997>998> Некоторые токены могут выступать как в роли операторов, так и в роли разделителей, в зависимости от контекста. Например, `*` – это и оператор умножения, и разделитель, используемый для распаковки последовательностей, а `@` – это и матричное умножение, и разделитель, которым начинаются декораторы.999>1000> Для некоторых токенов различие неочевидно. Например, одни считают `.`, `(` и `)` разделителями, а другие видят в них оператор [`getattr()`](https://python-all.ru/3/library/functions.html#getattr) и оператор(ы) вызова функции.1001>1002> Некоторые операторы Python, такие как `and`, `or` и `not in`, используют [ключевые слова](https://python-all.ru/3/reference/lexical_analysis.html#keywords), а не «символы» (токены операторов).10031004Последовательность из трёх подряд идущих точек (`...`) имеет особое значение как литерал [`Ellipsis`](https://python-all.ru/3/library/constants.html#Ellipsis).1005