Python ([ˈpaɪθən]; па́йтон, широко используется также русскоязычное произношение пито́н) — высокоуровневый язык программирования общего назначения с акцентом на производительность разработчика и читаемость кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.
Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Питоне организовывается в функции и классы, которые могут объединяться в модули (которые в свою очередь могут быть объединены в пакеты).
Эталонной реализацией Python является интерпретатор CPython, поддерживающий большинство активно используемых платформ. Он распространяется свободно под очень либеральной лицензией, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные. Есть реализации интерпретаторов для JVM (с возможностью компиляции), MSIL (с возможностью компиляции), LLVM и других. Проект PyPy предлагает реализацию Питона на самом Питоне, что уменьшает затраты на изменения языка и постановку экспериментов над новыми возможностями.
Python — активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют ANSI, ISO или другие официальные стандарты, их роль выполняет CPython.
Философия
Разработчики языка Python придерживаются определённой философии программирования, называемой «Дзэном Питона». Её текст выдаётся интерпретатором Питона по команде import this
(работает один раз за сессию). Автором этой философии считается Тим Пейтерс.
Текст философии:
- Красивое лучше, чем уродливое.
- Явное лучше, чем неявное.
- Простое лучше, чем сложное.
- Сложное лучше, чем запутанное.
- Свобода лучше, чем несвобода.
- Плоское лучше, чем вложенное.
- Разреженное лучше, чем плотное.
- Читаемость имеет значение.
- Особые случаи не настолько особые, чтобы нарушать правила.
- При этом практичность важнее безупречности.
- Ошибки никогда не должны замалчиваться.
- Если не замалчиваются явно.
- Встретив двусмысленность, отбрось искушение угадать.
- Должен существовать один — и, желательно, только один — очевидный способ сделать это.
- Хотя он поначалу может быть и не очевиден, если вы не голландец.
- Сейчас лучше, чем никогда.
- Хотя никогда зачастую лучше, чем прямо сейчас.
- Если реализацию сложно объяснить — идея плоха.
- Если реализацию легко объяснить — идея, возможно, хороша.
- Пространства имён — отличная штука! Будем делать их побольше!
Разработка языка Python была начата в конце 1980-х годов сотрудником голландского института CWI Гвидо ван Россумом. Для распределённой ОС Amoeba требовался расширяемый скриптовый язык, и Гвидо начал писать Python на досуге, позаимствовав некоторые наработки для языка ABC (англ.) (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале 1991 года Гвидо опубликовал исходный текст в ньюсгруппе alt.sources. С самого начала Python проектировался как объектно-ориентированный язык.
Название языка произошло вовсе не от вида пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу 1970-х «Летающий цирк Монти Пайтона». Впрочем, всё равно название языка чаще ассоциируют именно со змеёй, нежели с фильмом — пиктограммы файлов в KDE или в Microsoft Windows и даже эмблема на сайте python.org (до выхода версии 2.5) изображают змеиные головы.
Наличие дружелюбного, отзывчивого сообщества пользователей считается наряду с дизайнерской интуицией Гвидо одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (Python Enhancement Proposal) — предложений по развитию Python.
3 декабря2008 года, после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется сокращение Py3k). В Python 3000 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Питона. На сегодня поддерживаются обе ветви развития (Python 3.x и 2.x).
Влияние других языков на PythonПоявившись сравнительно поздно, Python создавался под влиянием множества языков программирования:
- ABC (англ.) — отступы для группировки операторов, высокоуровневые структуры данных (map) (фактически, Python создавался как попытка исправить ошибки, допущенные при проектировании ABC);
- Modula-3 — пакеты, модули, использование
else
совместно сtry
иexcept
, именованные аргументы функций (на это также повлиял Common Lisp); - С, C++ — некоторые синтаксические конструкции (как пишет сам Гвидо ван Россум — он использовал наиболее непротиворечивые конструкции из С, чтобы не вызвать неприязнь у С-программистов к Python);
- Smalltalk — объектно-ориентированное программирование;
- Lisp — отдельные черты функционального программирования (
lambda, map, reduce, filter
и другие); - Fortran — срезы массивов, комплексная арифметика;
- Miranda — списочные выражения;
- Java — модули logging, unittest, threading (часть возможностей оригинального модуля не реализована), xml.sax стандартной библиотеки, совместное использование finally и except при обработке исключений, использование @ для декораторов;
- Icon — генераторы.
Большая часть других возможностей Python (например, байт-компиляция исходного кода) также была реализована ранее в других языках.
ПортируемостьPython портирован и работает почти на всех известных платформах — от КПК до мейнфреймов. Существуют порты под Microsoft Windows, практически все варианты UNIX (включая FreeBSD и Linux), Plan 9, Mac OS и Mac OS X, iPhone OS 2.0 и выше, Palm OS, OS/2, Amiga, AS/400 и даже OS/390, Symbian и Android.
По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с серии 2.6 прекращена поддержка Windows 95, Windows 98 и Windows ME. Однако на этих платформах можно использовать предыдущие версии Python — на данный момент сообщество активно поддерживает версии Python начиная от 2.3 (для них выходят исправления).
При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft COM/DCOM). Более того, существует специальная версия Питона для виртуальной машины Java — Jython, что позволяет интерпретатору выполняться на любой системе, поддерживающей Java, при этом классы Java могут непосредственно использоваться из Питона и даже быть написанными на Питоне. Также несколько проектов обеспечивают интеграцию с платформой Microsoft .NET, основные из которых — IronPython и Python.Net.
Типы и структуры данных
Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». В Питоне имеются встроенные типы: булевые, строки, Unicode-строки, целые числа произвольной точности, числа с плавающей запятой, комплексные числа и некоторые другие. Из коллекций Python поддерживает кортежи (tuples), списки, словари (ассоциативные массивы) и, начиная с версии 2.4, множества. Все значения в Питоне являются объектами, в том числе функции, методы, модули, классы.
Добавить новый тип можно либо написав класс (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает наследование (одиночное и множественное) и метапрограммирование. Возможно наследование от большинства встроенных типов и типов расширений.
Все объекты делятся на ссылочные и атомарные. К атомарным относятся int
, long
, complex
и некоторые другие. При присваивании атомарных объектов копируется их
значение, в то время как для ссылочных копируется только указатель на
объект, таким образом, обе переменные после присваивания используют одно
и то же значение. Ссылочные объекты бывают изменяемые и неизменяемые.
Например, строки и кортежи являются неизменяемыми, а списки, словари и
многие другие объекты — изменяемыми. Кортеж в Питоне является, по сути,
неизменяемым списком. Во многих случаях кортежи работают быстрее списков, поэтому если вы не планируете изменять последовательность, то лучше использовать именно их.
Синтаксис и семантика
Язык обладает чётким и последовательным синтаксисом, продуманной модульностью и масштабируемостью, благодаря чему исходный код написанных на Питоне программ легко читаем.
Операторы
Набор операторов достаточно традиционен. Вот некоторые из них:
- условный оператор
if
(если). Альтернативный блок послеelse
(иначе). Если условий и альтернатив несколько, можно использоватьelif
(сокр. от else if). - операторы цикла
while
(пока) иfor
(для). Внутри цикла возможно применениеbreak
иcontinue
для прерывания цикла и перехода сразу к следующей итерации соответственно. - оператор определения класса
class
. - оператор определения функции, метода или генератора
def
. Внутри возможно применениеreturn
(возврат) для возврата из функции или метода, а в случае генератора —yield
(давать). - оператор обработки исключений
try
—except
—else
илиtry
—finally
(начиная с версии 2.5, можно использоватьfinally
,except
иelse
в одном блоке). - оператор
pass
ничего не делает. Используется для пустых блоков кода.
Выражения
Выражение является полноправным оператором в Питоне. Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок.
Отдельно стоит упомянуть операцию форматирования для строк (работает по аналогии с printf()
из Си), которая использует тот же символ, что и взятие остатка от деления:
Здравствуй, Мир!
Python имеет удобные цепочечные сравнения. Такие условия в программах — не редкость:
Кроме того, логические операции (
or
и and
) являются ленивыми:
если для вычисления значения операции достаточно первого операнда, этот
операнд и является результатом, в противном случае вычисляется второй
операнд логической операции. Это основывается на свойствах алгебры логики: например, если один аргумент операции «ИЛИ» (or
)
является истиной, то и результат этой операции всегда является истиной.
В случае, если второй операнд является сложным выражением, это
позволяет сократить издержки на его вычисление. Этот факт широко
использовался до версии 2.5 вместо условной конструкции:Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант):
True or False # булевы литералы
3.14 # число с плавающей запятой
012 + 0xA # числа в восьмеричной и шестнадцатеричной системах счисления
1 + 2j # комплексное число
[1, 2, "a"] # список
(1, 2, "a") # кортеж
{'a': 1, 'b': 'B'} # словарь
lambda x: x**2 # анонимная функция
Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза
s[N:M]
означает, что в срез попадают все элементы от N включительно до M не включая. В качестве иллюстрации можно посмотреть этот пример.Имена
Имя (идентификатор) может начинаться с латинской буквы любого
регистра или подчёркивания, после чего в имени можно использовать и
цифры. В качестве имени нельзя использовать ключевые слова (их список
можно узнать по import keyword; print keyword.kwlist
) и нежелательно переопределять встроенные имена. Имена, начинающиеся на подчёркивание, имеют специальное значение.
В каждой точке программы интерпретатор имеет доступ к трём пространствам имён (то есть отображениям имён в объекты): локальному, глобальному и встроенному.
Области видимости имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.
Строки документации
Python предлагает механизм документирования кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — docstring (англ.). Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации, что используется современными IDE (например, Eclipse).
В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить doctest (англ.) для автоматического тестирования модуля.
Директивы
Начиная с Python 2.3, для использования в тексте программы символов, не входящих в ASCII, необходимо явно указывать кодировку исходного кода в начале модуля, например:
После этого можно, например, использовать кириллицу в Unicode-литералах.
Возможности
Интерактивный режим
Подобно Лиспу и Прологу в режиме отладки, интерпретатор Питона имеет интерактивный режим работы, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран. Этот режим интересен не только новичкам, но и опытным программистам, которые могут протестировать в интерактивном режиме любой участок кода, прежде чем использовать его в основной программе, или просто использовать как калькулятор с большим набором функций.
Так выглядит общение с Питоном в интерактивном режиме:
1267650600228229401496703205376L
>>> from math import * # импорт математических функций
>>> sin(pi * 0.5) # вычисление синуса от половины пи
1.0
>>> help(sorted) # помощь по функции sorted
Help on built-in function sorted in module __builtin__:
sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
В интерактивном режиме доступен отладчикpdb и система помощи (вызывается по help()
). Система помощи работает для модулей, классов и функций, только если те были снабжены строками документации.
Кроме встроенной, существуют и улучшенные интерактивные оболочки IPython и bpython.
Объектно-ориентированное программирование
Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Питоне является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками.
Возможности и особенности:
- Классы являются одновременно объектами со всеми ниже приведёнными возможностями.
- Наследование, в том числе множественное.
- Полиморфизм (все функции виртуальные).
- Инкапсуляция (два уровня — общедоступные и скрытые методы и поля). Особенность — скрытые члены доступны для использования и помечены как скрытые лишь особыми именами.
- Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.
- Перегрузка операторов (всех, кроме
is, '.', '='
и символьных логических). - Свойства (имитация поля с помощью функций).
- Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).
- Методы для управления наиболее распространёнными операциями (истинностное значение,
len()
, глубокое копирование, сериализация, итерация по объекту, …) - Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.)
- Полная интроспекция.
- Классовые и статические методы, классовые поля.
- Классы, вложенные в функции и классы.
Python поддерживает парадигму функционального программирования, в частности:
- функция является объектом
- функции высших порядков
- рекурсия
- развитая обработка списков (списковые выражения, операции над последовательностями, итераторы)
- аналог замыканий
- частичное применение функции
- возможность реализации других средств на самом языке (например, карринг)
Программное обеспечение (приложение или библиотека) на Питоне оформляется в виде модулей, которые в свою очередь могут быть собраны в пакеты. Модули могут располагаться как в каталогах, так и в ZIP-архивах. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Питоне, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором
import
.
После импорта модуль представлен отдельным объектом, дающим доступ к
пространству имён модуля. В ходе выполнения программы модуль можно
перезагрузить функцией reload()
.Интроспекция
Python поддерживает полную интроспекцию времени исполнения. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.
Применение интроспекции является важной частью того, что называют pythonic style, и широко применяется в библиотеках и фреймворках Python, таких как PyRO, PLY, Cherry, Django и др., значительно экономя время использующего их программиста.