lexical_analysis.md
1> **Источник:** https://python-all.ru/2.7/reference/lexical_analysis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 2. Лексический анализ89Программа на Python читается *парсером*. На вход парсера подаётся поток\\n*токенов*, генерируемый *лексическим анализатором*. В этой главе описывается, как\\nлексический анализатор разбивает файл на токены.1011Python использует 7-битный набор символов ASCII для текста программы.1213Новое в версии 2.3: Объявление кодировки можно использовать, чтобы указать, что строковые литералы и комментарии используют кодировку, отличную от ASCII.1415Для совместимости со старыми версиями Python только выводит предупреждение, если находит 8-битные символы; эти предупреждения следует исправлять, либо объявив явную кодировку, либо используя escape-последовательности, если эти байты являются двоичными данными, а не символами.1617Набор символов времени выполнения зависит от устройств ввода-вывода, подключенных к программе, но в целом является надмножеством ASCII.1819**Примечание о будущей совместимости:** Может возникнуть соблазн предположить, что набор символов для 8-битных символов – это ISO Latin-1 (надмножество ASCII, охватывающее большинство западных языков, использующих латинский алфавит), но не исключено, что в будущем станут распространены текстовые редакторы, работающие с Unicode. Они обычно используют кодировку UTF-8, которая также является надмножеством ASCII, но с совершенно иным использованием символов с порядковыми номерами 128–255. Хотя единого мнения по этому вопросу пока нет, неразумно предполагать ни Latin-1, ни UTF-8, даже если текущая реализация, по-видимому, отдает предпочтение Latin-1. Это относится как к набору символов исходного кода, так и к набору символов времени выполнения.2021## 2.1. Структура строки2223Программа на Python состоит из нескольких *логических строк*.2425### 2.1.1. Логические строки2627Конец логической строки обозначается токеном NEWLINE. Инструкции не могут пересекать границы логических строк, за исключением случаев, когда NEWLINE допускается синтаксисом (например, между инструкциями в составных инструкциях). Логическая строка строится из одной или нескольких *физических строк* путём следования правилам явного или неявного *объединения строк*.2829### 2.1.2. Физические строки3031Физическая строка – это последовательность символов, завершающаяся последовательностью конца строки. В исходных файлах и строках можно использовать любые стандартные для платформы последовательности конца строки: форму Unix с использованием ASCII LF (перевод строки), форму Windows с использованием последовательности ASCII CR LF (возврат каретки и перевод строки) или старую форму Macintosh с символом ASCII CR (возврат каретки). Все эти формы взаимозаменяемы, независимо от платформы. Конец ввода также служит неявным завершителем последней физической строки.3233При встраивании Python исходные строки кода должны передаваться в API Python с использованием стандартных соглашений C для символов новой строки (символ `\n`, представляющий ASCII LF, является терминатором строки).3435### 2.1.3. Комментарии3637Комментарий начинается с символа решётки (`#`), не входящего в строковый литерал, и заканчивается в конце физической строки. Комментарий означает конец логической строки, если только не применяются правила неявного объединения строк. Синтаксис игнорирует комментарии; они не являются токенами.3839### 2.1.4. Объявления кодировки4041Если комментарий в первой или второй строке сценария Python соответствует регулярному выражению `coding[=:]\s*([-\w.]+)`, этот комментарий обрабатывается как объявление кодировки; первая группа этого выражения задаёт кодировку файла исходного кода. Объявление кодировки должно располагаться на отдельной строке. Если оно находится на второй строке, первая строка также должна содержать только комментарий. Рекомендуемые формы выражения кодировки:4243```python44# -*- coding: <encoding-name> -*-45```4647которая распознаётся также GNU Emacs, и4849```python50# vim:fileencoding=<encoding-name>51```5253которая распознается редактором VIM Брама Моленаара. Кроме того, если первые байты файла содержат метку порядка байтов UTF-8 (`'\xef\xbb\xbf'`), объявленная кодировка файла считается UTF-8 (это поддерживается, в частности, **блокнотом** Microsoft).5455Если кодировка объявлена, ее имя должно распознаваться Python. Кодировка используется для всего лексического анализа, в частности для нахождения конца строки и интерпретации содержимого литералов Unicode. Строковые литералы преобразуются в Unicode для синтаксического анализа, а затем перед началом интерпретации преобразуются обратно в исходную кодировку.5657### 2.1.5. Явное объединение строк5859Две или более физические строки могут быть объединены в логические строки с помощью символа обратной косой черты (`\`) следующим образом: если физическая строка заканчивается обратной косой чертой, которая не является частью строкового литерала или комментария, она объединяется со следующей строкой, образуя одну логическую строку; при этом обратная косая черта и следующий за ней символ конца строки удаляются. Например:6061```python62if 1900 < year < 2100 and 1 <= month <= 12 \63 and 1 <= day <= 31 and 0 <= hour < 24 \64 and 0 <= minute < 60 and 0 <= second < 60: # Похоже на корректную дату65 return 166```6768Строка, заканчивающаяся обратной косой чертой, не может содержать комментарий. Обратная косая черта не продолжает комментарий. Обратная косая черта не продолжает токен, за исключением строковых литералов (т.е. токены, отличные от строковых литералов, нельзя разделять между физическими строками с помощью обратной косой черты). Обратная косая черта недопустима в других местах строки вне строкового литерала.6970### 2.1.6. Неявное объединение строк7172Выражения в круглых, квадратных или фигурных скобках можно разбивать на несколько физических строк без использования обратной косой черты. Например:7374```python75month_names = ['Januari', 'Februari', 'Maart', # Это76 'April', 'Mei', 'Juni', # голландские названия77 'Juli', 'Augustus', 'September', # для месяцев78 'Oktober', 'November', 'December'] # года79```8081Неявно продолжаемые строки могут содержать комментарии. Отступ строк продолжения не важен. Допускаются пустые строки продолжения. Между неявно продолжаемыми строками не генерируется токен NEWLINE. Неявно продолжаемые строки также могут встречаться внутри строк в тройных кавычках (см. ниже); в этом случае они не могут содержать комментарии.8283### 2.1.7. Пустые строки8485Логическая строка, содержащая только пробелы, табуляции, символы перевода страницы и, возможно, комментарий, игнорируется (т. е. токен NEWLINE не генерируется). При интерактивном вводе операторов обработка пустой строки может различаться в зависимости от реализации цикла чтения-вычисления-вывода. В стандартной реализации полностью пустая логическая строка (т. е. не содержащая даже пробелов или комментария) завершает многострочный оператор.8687### 2.1.8. Отступы8889Начальные пробельные символы (пробелы и табуляции) в начале логической строки используются для вычисления уровня отступа строки, который, в свою очередь, используется для определения группировки инструкций.9091Сначала табуляции заменяются (слева направо) от одного до восьми пробелов так, чтобы общее количество символов до замены и включая ее было кратно восьми (предполагается, что это то же правило, что и в Unix). Затем общее количество пробелов перед первым непробельным символом определяет отступ строки. Отступ нельзя разделять на несколько физических строк с помощью обратной косой черты; пробелы до первой обратной косой черты определяют отступ.9293**Примечание о кроссплатформенной совместимости:** из-за особенностей текстовых редакторов на платформах, отличных от UNIX, не рекомендуется использовать смесь пробелов и табуляции для отступов в одном исходном файле. Также следует отметить, что разные платформы могут явно ограничивать максимальный уровень отступа.9495Символ перевода страницы может присутствовать в начале строки; он будет игнорироваться при вычислении отступа, описанном выше. Символы перевода страницы, встречающиеся в других местах начальных пробельных символов, имеют неопределённый эффект (например, они могут сбросить счётчик пробелов до нуля).9697Уровни отступа последовательных строк используются для генерации токенов INDENT и DEDENT, применяя стек, следующим образом.9899Before the first line of the file is read, a single zero is pushed on the stack; this will never be popped off again. The numbers pushed on the stack will always be strictly increasing from bottom to top. At the beginning of each logical line, the line’s indentation level is compared to the top of the stack. If it is equal, nothing happens. If it is larger, it is pushed on the stack, and one INDENT token is generated. If it is smaller, it *must* be one of the numbers occurring on the stack; all numbers on the stack that are larger are popped off, and for each number popped off a DEDENT token is generated. At the end of the file, a DEDENT token is generated for each number remaining on the stack that is larger than zero.100101Вот пример корректно (хотя и запутанно) оформленного отступами фрагмента кода Python:102103```python104def perm(l):105 # Вычислить список всех перестановок l106 if len(l) <= 1:107 return [l]108 r = []109 for i in range(len(l)):110 s = l[:i] + l[i+1:]111 p = perm(s)112 for x in p:113 r.append(l[i:i+1] + x)114 return r115```116117Следующий пример показывает различные ошибки отступов:118119```python120 def perm(l): # ошибка: первая строка с отступом121for i in range(len(l)): # ошибка: нет отступа122 s = l[:i] + l[i+1:]123 p = perm(l[:i] + l[i+1:]) # ошибка: неожиданный отступ124 for x in p:125 r.append(l[i:i+1] + x)126 return r # ошибка: несоответствие отступа127```128129(На самом деле первые три ошибки обнаруживаются синтаксическим анализатором; только последняя ошибка обнаруживается лексическим анализатором – отступ `return r` не соответствует уровню, извлечённому из стека.)130131### 2.1.9. Пробельные символы между токенами132133За исключением начала логической строки или строковых литералов, пробельные символы (пробел, табуляция, перевод страницы) могут использоваться взаимозаменяемо для разделения токенов. Пробел требуется между двумя токенами только в том случае, если их объединение может быть интерпретировано как другой токен (например, ab – один токен, а a b – два токена).134135## 2.2. Прочие токены136137Besides NEWLINE, INDENT and DEDENT, the following categories of tokens exist: *identifiers*, *keywords*, *literals*, *operators*, and *delimiters*. Whitespace characters (other than line terminators, discussed earlier) are not tokens, but serve to delimit tokens. Where ambiguity exists, a token comprises the longest possible string that forms a legal token, when read from left to right.138139## 2.3. Identifiers and keywords140141Идентификаторы (также называемые *именами*) описываются следующими лексическими определениями:142143```144145identifier ::= (letter|"_") (letter | digit | "_")*146letter ::= lowercase | uppercase147lowercase ::= "a"..."z"148uppercase ::= "A"..."Z"149digit ::= "0"..."9"150```151152Идентификаторы не имеют ограничения по длине. Регистр имеет значение.153154### 2.3.1. Ключевые слова155156The following identifiers are used as reserved words, or *keywords* of the language, and cannot be used as ordinary identifiers. They must be spelled exactly as written here:157158```text159and del from not while160as elif global or with161assert else if pass yield162break except import print163class exec in raise164continue finally is return165def for lambda try166```167168Изменено в версии 2.4: [`None`](https://python-all.ru/2.7/library/constants.html#None) стал константой и теперь распознается компилятором как имя встроенного объекта [`None`](https://python-all.ru/2.7/library/constants.html#None). Хотя это не ключевое слово, ему нельзя присвоить другой объект.169170Изменено в версии 2.5: Использование [`as`](https://python-all.ru/2.7/reference/compound_stmts.html#as) и [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with) в качестве идентификаторов вызывает предупреждение. Чтобы использовать их как ключевые слова, включите будущую возможность `with_statement`.171172Изменено в версии 2.6: [`as`](https://python-all.ru/2.7/reference/compound_stmts.html#as) и [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with) стали полноценными ключевыми словами.173174### 2.3.2. Зарезервированные классы идентификаторов175176Некоторые классы идентификаторов (помимо ключевых слов) имеют специальное значение. Эти классы определяются по шаблонам ведущих и завершающих символов подчёркивания:177178**`_*`**179180Не импортируется конструкцией `from module import *`. Специальный идентификатор `_` используется в интерактивном интерпретаторе для хранения результата последнего вычисления; он хранится в модуле [`__builtin__`](https://python-all.ru/2.7/library/__builtin__.html#module-__builtin__). Если не в интерактивном режиме, `_` не имеет специального значения и не определён. См. раздел [Оператор import](https://python-all.ru/2.7/reference/simple_stmts.html#import).181182> **Примечание**183>184> Имя `_` часто используется в связи с интернационализацией; обратитесь к документации модуля [`gettext`](https://python-all.ru/2.7/library/gettext.html#module-gettext) для получения дополнительной информации об этом соглашении.185186**`__*__`**187188Системные имена. Эти имена определяются интерпретатором и его реализацией (включая стандартную библиотеку). Текущие системные имена обсуждаются в разделе [Специальные имена методов](https://python-all.ru/2.7/reference/datamodel.html#specialnames) и в других местах. В будущих версиях Python, скорее всего, появится больше таких имён. *Любое* использование имён `__*__`, в любом контексте, не соответствующее явно задокументированному назначению, может быть нарушено без предупреждения.189190**`__*`**191192Приватные имена классов. Имена этой категории при использовании в контексте определения класса переписываются в искажённую форму, чтобы избежать конфликтов имён между «приватными» атрибутами базовых и производных классов. См. раздел [Идентификаторы (имена)](https://python-all.ru/2.7/reference/expressions.html#atom-identifiers).193194## 2.4. Литералы195196Литералы – это обозначения константных значений некоторых встроенных типов.197198### 2.4.1. Строковые литералы199200Строковые литералы описываются следующими лексическими определениями:201202```203204stringliteral ::= [stringprefix](shortstring | longstring)205stringprefix ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"206 | "b" | "B" | "br" | "Br" | "bR" | "BR"207shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'208longstring ::= "'''" longstringitem* "'''"209 | '"""' longstringitem* '"""'210shortstringitem ::= shortstringchar | escapeseq211longstringitem ::= longstringchar | escapeseq212shortstringchar ::= <any source character except "\" or newline or the quote>213longstringchar ::= <any source character except "\">214escapeseq ::= "\" <any ASCII character>215```216217Одно синтаксическое ограничение, не указанное в этих продукциях, заключается в том, что пробелы не допускаются между [`stringprefix`](https://python-all.ru/2.7/reference/lexical_analysis.html#grammar-token-stringprefix) и остальной частью строкового литерала. Набор символов исходного кода определяется объявлением кодировки; если в исходном файле нет объявления кодировки, это ASCII; см. раздел [Объявления кодировки](https://python-all.ru/2.7/reference/lexical_analysis.html#encodings).218219Простыми словами: строковые литералы могут быть заключены в парные одинарные кавычки (`'`) или двойные кавычки (`"`). Они также могут быть заключены в парные группы из трех одинарных или двойных кавычек (обычно называются *строками в тройных кавычках*). Символ обратной косой черты (`\`) используется для экранирования символов, которые в противном случае имеют специальное значение, таких как новая строка, сама обратная косая черта или символ кавычки. Строковые литералы могут опционально начинаться с буквы `'r'` или `'R'`; такие строки называются *сырыми строками* и используют другие правила интерпретации escape-последовательностей с обратной косой чертой. Префикс `'u'` или `'U'` превращает строку в строку Unicode. Строки Unicode используют набор символов Unicode, определенный консорциумом Unicode и ISO 10646. Некоторые дополнительные escape-последовательности, описанные ниже, доступны в строках Unicode. Префикс `'b'` или `'B'` в Python 2 игнорируется; он указывает, что литерал должен стать байтовым литералом в Python 3 (например, при автоматическом преобразовании кода с помощью 2to3). За префиксом `'u'` или `'b'` может следовать префикс `'r'`.220221В строках с тройными кавычками допускаются неэкранированные переводы строк и кавычки (они сохраняются), за исключением того, что три неэкранированные кавычки подряд завершают строку. (Под «кавычкой» понимается символ, которым открывается строка, то есть либо `'`, либо `"`.)222223Если не указан префикс `'r'` или `'R'`, escape-последовательности в строках интерпретируются по правилам, аналогичным используемым в Standard C. Распознаваемые escape-последовательности:224225| Escape-последовательность | Значение | Примечания |226| --- | --- | --- |227| `\newline` | Игнорируется | |228| `\\` | Обратная косая черта (`\`) | |229| `\'` | Одинарная кавычка (`'`) | |230| `\"` | Двойная кавычка (`"`) | |231| `\a` | ASCII Звонок (BEL) | |232| `\b` | ASCII Забой (BS) | |233| `\f` | ASCII Перевод страницы (FF) | |234| `\n` | ASCII Перевод строки (LF) | |235| `\N{name}` | Символ с именем *name* в базе данных Unicode (только Unicode) | |236| `\r` | ASCII Возврат каретки (CR) | |237| `\t` | ASCII горизонтальная табуляция (TAB) | |238| `\uxxxx` | Символ с 16-битным шестнадцатеричным значением *xxxx* (только Unicode) | (1) |239| `\Uxxxxxxxx` | Символ с 32-битным шестнадцатеричным значением *xxxxxxxx* (только Unicode) | (2) |240| `\v` | ASCII вертикальная табуляция (VT) | |241| `\ooo` | Символ с восьмеричным значением *ooo* | (3,5) |242| `\xhh` | Символ с шестнадцатеричным значением *hh* | (4,5) |243244Примечания:2452461. Отдельные кодовые единицы, составляющие части суррогатной пары, могут быть закодированы с помощью этой escape-последовательности.2472. Любой символ Unicode может быть закодирован таким образом, но символы за пределами Основной многоязычной плоскости (BMP) будут кодироваться с использованием суррогатной пары, если Python скомпилирован для использования 16-битных кодовых единиц (по умолчанию).2483. Как и в стандарте C, допускается до трёх восьмеричных цифр.2494. В отличие от стандартного C, требуется ровно две шестнадцатеричные цифры.2505. В строковом литерале шестнадцатеричные и восьмеричные escape-последовательности обозначают байт с заданным значением; не обязательно, чтобы байт кодировал символ в исходной кодировке. В литерале Unicode эти escape-последовательности обозначают символ Unicode с заданным значением.251252В отличие от Standard C, все нераспознанные escape-последовательности остаются в строке без изменений, т. е. *обратная косая черта остается в строке*. (Такое поведение полезно при отладке: если escape-последовательность введена с ошибкой, результирующий вывод легче распознать как поврежденный.) Также важно отметить, что escape-последовательности, помеченные как «(только Unicode)» в таблице выше, относятся к категории нераспознанных escape для не-Unicode строковых литералов.253254Когда присутствует префикс `'r'` или `'R'`, символ, следующий за обратной косой чертой, включается в строку без изменений, и *все обратные косые черты остаются в строке*. Например, строковый литерал `r"\n"` состоит из двух символов: обратной косой черты и строчной `'n'`. Кавычки строки могут быть экранированы обратной косой чертой, но обратная косая черта остается в строке; например, `r"\""` – это допустимый строковый литерал, состоящий из двух символов: обратной косой черты и двойной кавычки; `r"\"` не является допустимым строковым литералом (даже сырая строка не может заканчиваться нечетным количеством обратных косых черт). В частности, *сырая строка не может заканчиваться одной обратной косой чертой* (поскольку обратная косая черта экранировала бы следующий символ кавычки). Также обратите внимание, что одиночная обратная косая черта, за которой следует новая строка, интерпретируется как эти два символа в составе строки, *а не* как продолжение строки.255256Когда префикс `'r'` или `'R'` используется вместе с префиксом `'u'` или `'U'`, то escape-последовательности `\uXXXX` и `\UXXXXXXXX` обрабатываются, а *все остальные обратные косые черты остаются в строке*. Например, строковый литерал `ur"\u0062\n"` состоит из трех символов Unicode: «LATIN SMALL LETTER B», «REVERSE SOLIDUS» и «LATIN SMALL LETTER N». Обратные косые черты могут быть экранированы предшествующей обратной косой чертой; однако обе остаются в строке. В результате escape-последовательности `\uXXXX` распознаются только при нечетном количестве обратных косых черт.257258### 2.4.2. Конкатенация строковых литералов259260Допускается использование нескольких смежных строковых литералов (разделенных пробелами), возможно, с разными соглашениями о кавычках, и их значение эквивалентно их конкатенации. Таким образом, `"hello" 'world'` эквивалентно `"helloworld"`. Эту возможность можно использовать для уменьшения количества необходимых обратных косых черт, удобного разбиения длинных строк на строки или даже для добавления комментариев к частям строк, например:261262```python263re.compile("[A-Za-z_]" # буква или подчёркивание264 "[A-Za-z0-9_]*" # буква, цифра или подчёркивание265 )266```267268Обратите внимание, что эта возможность определяется на синтаксическом уровне, но реализуется на этапе компиляции. Оператор '+' должен использоваться для конкатенации строковых выражений во время выполнения. Также обратите внимание, что при конкатенации литералов для каждого компонента можно использовать разные стили кавычек (в том числе смешивать сырые строки и строки в тройных кавычках).269270### 2.4.3. Числовые литералы271272Существует четыре типа числовых литералов: обычные целые числа, длинные целые числа, числа с плавающей точкой и мнимые числа. Комплексных литералов нет (комплексные числа можно получить сложением действительного и мнимого чисел).273274Обратите внимание, что числовые литералы не включают знак; конструкция вида `-1` на самом деле является выражением, состоящим из унарного оператора ‘`-`‘ и литерала `1`.275276### 2.4.4. Литералы целых и длинных целых чисел277278Литералы целых и длинных целых чисел описываются следующими лексическими определениями:279280```281282longinteger ::= integer ("l" | "L")283integer ::= decimalinteger | octinteger | hexinteger | bininteger284decimalinteger ::= nonzerodigit digit* | "0"285octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+286hexinteger ::= "0" ("x" | "X") hexdigit+287bininteger ::= "0" ("b" | "B") bindigit+288nonzerodigit ::= "1"..."9"289octdigit ::= "0"..."7"290bindigit ::= "0" | "1"291hexdigit ::= digit | "a"..."f" | "A"..."F"292```293294Хотя в качестве суффикса для длинных целых чисел допускаются как строчная `'l'`, так и прописная `'L'`, настоятельно рекомендуется всегда использовать `'L'`, так как буква `'l'` слишком похожа на цифру `'1'`.295296Литералы обычных целых чисел, превышающие наибольшее представимое обычное целое (например, 2147483647 при 32-битной арифметике), воспринимаются так, как если бы они были литералами длинных целых. [1](https://python-all.ru/2.7/reference/lexical_analysis.html#id11) Для литералов длинных целых нет иных ограничений, кроме доступного объёма памяти.297298Несколько примеров литералов обычных целых (первая строка) и литералов длинных целых (вторая и третья строки):299300```python3017 2147483647 01773023L 79228162514264337593543950336L 0377L 0x100000000L303 79228162514264337593543950336 0xdeadbeef304```305306### 2.4.5. Литералы с плавающей запятой307308Литералы с плавающей запятой описываются следующими лексическими определениями:309310```311312floatnumber ::= pointfloat | exponentfloat313pointfloat ::= [intpart] fraction | intpart "."314exponentfloat ::= (intpart | pointfloat) exponent315intpart ::= digit+316fraction ::= "." digit+317exponent ::= ("e" | "E") ["+" | "-"] digit+318```319320Обратите внимание, что целая часть и порядок чисел с плавающей точкой могут выглядеть как восьмеричные целые, но интерпретируются по основанию 10. Например, `077e010` допустимо и обозначает то же число, что и `77e10`. Допустимый диапазон литералов с плавающей точкой зависит от реализации. Некоторые примеры литералов с плавающей точкой:321322```python3233.14 10. .001 1e100 3.14e-10 0e0324```325326Обратите внимание, что числовые литералы не включают знак; конструкция вида `-1` на самом деле является выражением, состоящим из унарного оператора `-` и литерала `1`.327328### 2.4.6. Мнимые литералы329330Мнимые литералы описываются следующими лексическими определениями:331332```333334imagnumber ::= (floatnumber | intpart) ("j" | "J")335```336337Мнимый литерал даёт комплексное число с действительной частью 0.0. Комплексные числа представляются в виде пары чисел с плавающей запятой и имеют те же ограничения по диапазону. Чтобы создать комплексное число с ненулевой действительной частью, добавьте к нему число с плавающей запятой, например, `(3+4j)`. Некоторые примеры мнимых литералов:338339```python3403.14j 10.j 10j .001j 1e100j 3.14e-10j341```342343## 2.5. Операторы344345Следующие токены являются операторами:346347```text348+ - * ** / // %349<< >> & | ^ ~350< > <= >= == != <>351```352353Операторы сравнения `<>` и `!=` – это два варианта записи одного и того же оператора. `!=` – предпочтительное написание; `<>` устарело.354355## 2.6. Разделители356357Следующие токены служат разделителями в грамматике:358359```text360( ) [ ] { } @361, : . ` = ;362+= -= *= /= //= %=363&= |= ^= >>= <<= **=364```365366Точка также может встречаться в литералах с плавающей точкой и мнимых литералах. Последовательность из трёх точек имеет особое значение – многоточие в срезах. Вторая половина списка, операторы расширенного присваивания, с лексической точки зрения служат разделителями, но также выполняют и операцию.367368Следующие печатные ASCII-символы имеют специальное значение как часть других токенов или иным образом значимы для лексического анализатора:369370```text371' " # \372```373374Следующие печатные ASCII-символы не используются в Python. Их появление вне строковых литералов и комментариев является безусловной ошибкой:375376```text377$ ?378```379380Сноски381382**[1](https://python-all.ru/2.7/reference/lexical_analysis.html#id8)**383384В версиях Python до 2.4 восьмеричные и шестнадцатеричные литералы, значение которых находилось чуть выше наибольшего представимого обычного целого, но меньше наибольшего 32-битного числа без знака (на машине с 32-битной арифметикой), равного 4294967296, воспринимались как отрицательное обычное целое, полученное вычитанием 4294967296 из их значения без знака.385