1. Введение¶
В этом справочном руководстве описывается язык программирования Python. Оно не предназначено в качестве учебного пособия.
Хотя я стараюсь быть как можно более точным, я решил использовать английский язык, а не формальные спецификации для всего, кроме синтаксиса и лексического анализа. Это должно сделать документ более понятным для среднего читателя, но оставит место для двусмысленностей. Следовательно, если бы вы прилетели с Марса и попытались реализовать Python только на основе этого документа, вам, возможно, пришлось бы угадывать некоторые вещи, и в итоге вы, вероятно, реализовали бы совсем другой язык. С другой стороны, если вы используете Python и задаетесь вопросом, каковы точные правила в той или иной области языка, вы определенно сможете найти их здесь. Если вы хотите увидеть более формальное определение языка, возможно, вы могли бы посвятить этому свое время — или изобрести машину для клонирования :-).
Опасно добавлять слишком много деталей реализации в справочный документ по языку - реализация может измениться, и другие реализации того же языка могут работать по-другому. С другой стороны, CPython - это единственная реализация Python, которая широко используется (хотя альтернативные реализации продолжают получать поддержку), и ее специфические причуды иногда стоит упомянуть, особенно когда реализация накладывает дополнительные ограничения. Поэтому по всему тексту вы найдете краткие «примечания по реализации».
Каждая реализация Python поставляется с рядом встроенных и стандартных модулей. Они документированы в Стандартная библиотека Python. Несколько встроенных модулей упоминаются, когда они существенным образом взаимодействуют с определением языка.
1.1. Альтернативные реализации¶
Хотя существует одна реализация Python, которая является наиболее популярной, есть несколько альтернативных реализаций, которые представляют особый интерес для различных аудиторий.
Известные реализации включают:
- CPython
Это оригинальная и наиболее поддерживаемая реализация Python, написанная на языке C. Новые возможности языка обычно появляются здесь первыми.
- Jython
Python, реализованный на языке Java. Эта реализация может быть использована в качестве языка сценариев для Java-приложений или для создания приложений с использованием библиотек классов Java. Он также часто используется для создания тестов для библиотек Java. Более подробную информацию можно найти на сайте the Jython website.
- Python для .NET
Эта реализация фактически использует реализацию CPython, но является управляемым приложением .NET и делает доступными библиотеки .NET. Она была создана Брайаном Ллойдом. Для получения дополнительной информации смотрите Python for .NET home page.
- IronPython
Альтернативный Python для .NET. В отличие от Python.NET, это полная реализация Python, которая генерирует IL и компилирует код Python непосредственно в сборки .NET. Он был создан Джимом Хугунином, оригинальным создателем Jython. Для получения дополнительной информации смотрите the IronPython website.
- PyPy
Реализация Python, полностью написанная на Python. Она поддерживает несколько расширенных возможностей, не встречающихся в других реализациях, таких как поддержка stackless и компилятор Just in Time. Одной из целей проекта является поощрение экспериментов с самим языком путем упрощения модификации интерпретатора (поскольку он написан на Python). Дополнительная информация доступна на сайте the PyPy project’s home page.
Каждая из этих реализаций в чем-то отличается от языка, описанного в данном руководстве, или вводит специфическую информацию, выходящую за рамки того, что описано в стандартной документации по Python. Пожалуйста, обратитесь к документации по конкретной реализации, чтобы определить, что еще вам нужно знать о конкретной реализации, которую вы используете.
1.2. Условные обозначения¶
В описаниях лексического анализа и синтаксиса используется модифицированная грамматическая нотация BNF. При этом используется следующий стиль определений:
name ::=lc_letter
(lc_letter
| "_")* lc_letter ::= "a"..."z"
В первой строке говорится, что name
- это lc_letter
, за которым следует последовательность из нуля или более lc_letter
s и знаков подчеркивания. В свою очередь, lc_letter
- это любой из одиночных символов с 'a'
по 'z'
. (Это правило фактически соблюдается для имен, определенных в лексических и грамматических правилах данного документа).
Каждое правило начинается с имени (которое является именем, определяемым правилом) и ::=
. Вертикальная полоска (|
) используется для разделения альтернатив; это оператор наименьшего связывания в данной нотации. Звезда (*
) означает ноль или более повторений предыдущего элемента; аналогично, плюс (+
) означает одно или более повторений, а фраза, заключенная в квадратные скобки ([ ]
) означает ноль или одно вхождение (другими словами, заключенная фраза является необязательной). Операторы *
и +
связывают как можно плотнее; круглые скобки используются для группировки. Буквальные строки заключаются в кавычки. Белое пространство имеет смысл только для разделения лексем. Правила обычно содержатся в одной строке; правила с большим количеством альтернатив могут быть отформатированы альтернативно: каждая строка после первой начинается с вертикальной полосы.
В лексических определениях (как в примере выше) используются еще два соглашения: Два литеральных символа, разделенные тремя точками, означают выбор любого символа из заданного (включительно) диапазона символов ASCII. Фраза между угловыми скобками (<...>
) дает неформальное описание определяемого символа; например, это может быть использовано для описания понятия «управляющий символ», если это необходимо.
Несмотря на то, что используемая нотация практически одинакова, существует большая разница между значением лексических и синтаксических определений: лексическое определение оперирует отдельными символами входного источника, в то время как синтаксическое определение оперирует потоком лексем, генерируемых лексическим анализом. Все использования БНФ в следующей главе («Лексический анализ») являются лексическими определениями; использования в последующих главах - синтаксическими определениями.