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. Условные обозначения¶
В описаниях лексического анализа и синтаксиса используется модифицированная Backus–Naur form (BNF) грамматическая нотация. В ней используется следующий стиль определений:
name ::=lc_letter
(lc_letter
| "_")* lc_letter ::= "a"..."z"
В первой строке говорится, что name
- это lc_letter
, за которым следует последовательность из нуля или более lc_letter
s и подчеркиваний. В свою очередь, lc_letter
- это любой из одиночных символов с 'a'
по 'z'
. (Это правило фактически соблюдается для имен, определенных в лексических и грамматических правилах в этом документе).
Каждое правило начинается с имени (которое является именем, определяемым правилом) и ::=
. Вертикальная полоска (|
) используется для разделения альтернатив; в этой нотации она является наименьшим связующим оператором. Звезда (*
) означает ноль или более повторений предыдущего элемента; аналогично, плюс (+
) означает одно или более повторений, а фраза, заключенная в квадратные скобки ([ ]
), означает ноль или одно вхождение (другими словами, заключенная фраза необязательна). Операторы *
и +
связывают как можно плотнее; для группировки используются круглые скобки. Буквальные строки заключаются в кавычки. Белое пространство имеет смысл только для разделения лексем. Правила обычно содержатся в одной строке; правила с большим количеством альтернатив могут быть отформатированы альтернативно: каждая строка после первой начинается с вертикальной полосы.
В лексических определениях (как в примере выше) используются еще два соглашения: Два буквенных символа, разделенные тремя точками, означают выбор любого символа из заданного (включительно) диапазона символов ASCII. Фраза между угловыми скобками (<...>
) дает неформальное описание определяемого символа; например, это может быть использовано для описания понятия «управляющий символ», если это необходимо.
Несмотря на то, что используемая нотация практически одинакова, существует большая разница между значением лексических и синтаксических определений: лексическое определение оперирует отдельными символами входного источника, в то время как синтаксическое определение оперирует потоком лексем, генерируемых лексическим анализом. Все случаи использования БНФ в следующей главе («Лексический анализ») являются лексическими определениями, а в последующих главах - синтаксическими определениями.