1. вступ

Цей довідковий посібник описує мову програмування Python. Він не призначений як підручник.

Хоча я намагаюся бути максимально точним, я вирішив використовувати англійську, а не формальні специфікації для всього, крім синтаксису та лексичного аналізу. Це повинно зробити документ більш зрозумілим для пересічного читача, але залишить місце для неоднозначностей. Отже, якби ви прилетіли з Марса й спробували повторно впровадити Python лише з цього документу, вам, можливо, доведеться щось здогадуватися, і насправді ви, ймовірно, закінчили б впровадженням зовсім іншої мови. З іншого боку, якщо ви використовуєте Python і вам цікаво, якими є точні правила щодо певної області мови, ви точно зможете знайти їх тут. Якщо ви бажаєте побачити більш формальне визначення мови, можливо, ви можете приділити свій час — або винайти машину для клонування :-).

Небезпечно додавати забагато деталей реалізації до довідкового документа про мову – реалізація може змінитися, а інші реалізації тієї самої мови можуть працювати по-різному. З іншого боку, CPython є єдиною реалізацією Python, яка широко використовується (хоча альтернативні реалізації продовжують отримувати підтримку), і іноді варто згадати його особливості, особливо якщо реалізація накладає додаткові обмеження. Таким чином, ви знайдете короткі «нотатки щодо реалізації», розкидані по всьому тексту.

Кожна реалізація Python має низку вбудованих і стандартних модулів. Вони задокументовані в Стандартна бібліотека Python. Кілька вбудованих модулів згадуються, коли вони суттєво взаємодіють із визначенням мови.

1.1. Альтернативні реалізації

Хоча існує одна реалізація Python, яка на сьогоднішній день є найпопулярнішою, є кілька альтернативних реалізацій, які становлять особливий інтерес для різних аудиторій.

Відомі реалізації включають:

CPython

Це оригінальна і найбільш підтримувана реалізація Python, написана мовою C. Нові функції мови зазвичай з’являються тут першими.

Jython

Python implemented in Java. This implementation can be used as a scripting language for Java applications, or can be used to create applications using the Java class libraries. It is also often used to create tests for Java libraries. More information can be found at the Jython website.

Python для .NET

Ця реалізація фактично використовує реалізацію CPython, але є керованою програмою .NET і робить доступними бібліотеки .NET. Його створив Браян Ллойд. Щоб отримати додаткові відомості, перегляньте домашню сторінку Python для .NET.

IronPython

An alternate Python for .NET. Unlike Python.NET, this is a complete Python implementation that generates IL, and compiles Python code directly to .NET assemblies. It was created by Jim Hugunin, the original creator of Jython. For more information, see the IronPython website.

PyPy

An implementation of Python written completely in Python. It supports several advanced features not found in other implementations like stackless support and a Just in Time compiler. One of the goals of the project is to encourage experimentation with the language itself by making it easier to modify the interpreter (since it is written in Python). Additional information is available on the PyPy project’s home page.

Кожна з цих реалізацій певним чином відрізняється від мови, задокументованої в цьому посібнику, або вводить певну інформацію, окрім того, що описано в стандартній документації Python. Зверніться до документації щодо реалізації, щоб визначити, що ще вам потрібно знати про конкретну реалізацію, яку ви використовуєте.

1.2. Позначення

The descriptions of lexical analysis and syntax use a modified Backus–Naur form (BNF) grammar notation. This uses the following style of definition:

name      ::=  lc_letter (lc_letter | "_")*
lc_letter ::=  "a"..."z"

Перший рядок говорить, що name є lc_letter, за яким слідує послідовність нуля або більше lc_letterі підкреслення. lc_letter, у свою чергу, є будь-яким із окремих символів 'a' до 'z'. (Це правило фактично дотримується для імен, визначених у лексичних і граматичних правилах у цьому документі.)

Кожне правило починається з назви (яка є назвою, визначеною правилом) і ::=. Вертикальна риска (|) використовується для розділення альтернатив; це найменш обов’язковий оператор у цій нотації. Зірочка (*) означає нуль або більше повторень попереднього елемента; аналогічно, плюс (+) означає одне або більше повторень, а фраза, взята в квадратні дужки ([ ]), означає нуль або одне повторення (іншими словами, фраза всередині є необов’язковою). Оператори * і + прив’язуються якомога тісніше; дужки використовуються для групування. Літеральні рядки беруться в лапки. Пробіл має значення лише для розділення токенів. Зазвичай правила містяться в одному рядку; правила з багатьма альтернативами можуть бути відформатовані альтернативно, коли кожен рядок після першого починається з вертикальної смуги.

У лексичних визначеннях (як у прикладі вище) використовуються ще дві конвенції: два літеральні символи, розділені трьома крапками, означають вибір будь-якого окремого символу в заданому (включно) діапазоні символів ASCII. Фраза в кутових дужках (<...>) дає неформальний опис визначеного символу; наприклад, це можна використовувати для опису поняття «керуючий характер», якщо це необхідно.

Незважаючи на те, що використана нотація майже однакова, існує велика різниця між значенням лексичних і синтаксичних визначень: лексичне визначення працює з окремими символами джерела вхідних даних, тоді як визначення синтаксису працює з потоком лексем, згенерованих лексичний аналіз. Усі використання BNF у наступному розділі («Лексичний аналіз») є лексичними визначеннями; використання в наступних розділах є синтаксичними визначеннями.