Python

Python


Логотип Python (1990—2005)

Python[7] ( [ˈpʌɪθ(ə)n]; в русском языке распространено название пито́н[8]) — [высокоуровневый язык программирования] общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. [Синтаксис] ядра Python минималистичен. В то же время [стандартная библиотека] включает большой объём полезных функций.

Python поддерживает несколько [парадигм программирования], в том числе [структурное], [объектно-ориентированное], [функциональное], [императивное] и [аспектно-ориентированное]. Основные архитектурные черты — [динамическая типизация], [автоматическое управление памятью], полная [интроспекция], механизм [обработки исключений], поддержка [многопоточных вычислений] и удобные высокоуровневые [структуры данных]. Код в Python организовывается в функции и [классы], которые могут объединяться в [модули] (они в свою очередь могут быть объединены в пакеты).

Эталонной реализацией Python является интерпретатор [CPython], поддерживающий большинство активно используемых платформ[9]. Он распространяется под [свободной лицензией] Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая [проприетарные][10]. Есть реализации интерпретаторов для [JVM] (с возможностью [компиляции]), [MSIL] (с возможностью [компиляции]), [LLVM] и других. Проект [PyPy] предлагает реализацию Python с использованием [JIT-компиляции], которая значительно увеличивает скорость выполнения Python-программ.

Python — активно развивающийся [язык программирования], новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют [стандарт ANSI], [ISO] или другие официальные стандарты, их роль выполняет [CPython].

Философия

Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («[Дзен] Пито́на», или «Дзен Па́йтона»)[11]. Её текст выдаётся [интерпретатором] Python по команде import this (работает один раз за сессию). Автором этой философии считается [Тим Петерс] (Tim Peters).

Текст философии:
.mw-parser-output .ts-Начало_цитаты-quote{float:none;padding:0.25em 1em;border:thin solid #eaecf0}.mw-parser-output .ts-Начало_цитаты-source{margin:1em 0 0 5%;font-size:105%}.mw-parser-output .ts-Начало_цитаты-quote .ts-oq{margin:0 -1em -0.25em}.mw-parser-output .ts-Начало_цитаты-quote .ts-oq .NavFrame{padding:0}.mw-parser-output .ts-Начало_цитаты-quote .ts-oq .NavHead,.mw-parser-output .ts-Начало_цитаты-quote .ts-oq .NavContent{padding-left:1.052632em;padding-right:1.052632em}

Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Плоское лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
Особые случаи не настолько особые, чтобы нарушать правила.
При этом практичность важнее безупречности.
Ошибки никогда не должны замалчиваться.
Если не замалчиваются явно.
Встретив двусмысленность, отбрось искушение угадать.
Должен существовать один — и, желательно, только один — очевидный способ сделать это.
Хотя он поначалу может быть и не очевиден, если вы не голландец[12].
Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить — идея плоха.
Если реализацию легко объяснить — идея, возможно, хороша.
Пространства имён — отличная вещь! Давайте будем делать их больше!
.mw-parser-output .ts-oq{overflow:auto;font-style:normal}.mw-parser-output .ts-oq .ref-info{font-size:100%}.mw-parser-output .ts-oq .NavToggle{float:none;position:static;right:auto;text-align:left;margin-left:1em}Оригинальный текст (англ.)

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one — and preferably only one — obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than 'right now'.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

.mw-parser-output .ts-Конец_цитаты-source{margin:0.357143em 2em 0 0;text-align:right}

История

Разработка языка Python была начата в конце [1980-х годов][13] сотрудником голландского института CWI [Гвидо ван Россумом]. Для распределённой ОС [Amoeba] требовался расширяемый [скриптовый язык], и Гвидо начал писать Python на досуге, позаимствовав некоторые наработки для языка [ABC] (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале [1991 года] Гвидо опубликовал исходный текст в [группе новостей] alt.sources[14]. С самого начала Python проектировался как [объектно-ориентированный язык].

.py

Название языка произошло вовсе не от вида пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу [1970-х] «[Летающий цирк Монти Пайтона]». Впрочем, всё равно название языка чаще связывают именно со змеёй, нежели с передачей — [пиктограммы] файлов в [KDE] или в [Microsoft Windows] и даже эмблема на сайте python.org (до выхода версии 2.5) изображают змеиные головы. Важная цель разработчиков Python — создавать его забавным для использования. Это отражено в его названии, которое пришло из [Монти Пайтона][15]. Также это отражено в иногда игривом подходе к обучающим программам и справочным материалам, таким как примеры использования, которые используют понятия ветчины (spam[16]) и яиц[17] вместо стандартных foo и bar.[18][19]

Наличие дружелюбного, отзывчивого сообщества пользователей считается наряду с дизайнерской интуицией Гвидо одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP ([англ.] Python Enhancement Proposal) — предложений по развитию Python[20].

[3 декабря] [2008 года][21], после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется [сокращение] Py3k). В Python 3000 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python. На сегодня поддерживаются обе ветви развития (Python 3.x и 2.x).

Влияние других языков на Python

Появившись сравнительно поздно, Python создавался под влиянием множества языков программирования:

  • ABC — отступы для группировки операторов, высокоуровневые структуры данных (map)[22][23] (Python фактически создавался как попытка исправить ошибки, допущенные при проектировании ABC);
  • Modula-3 — пакеты, модули, использование else совместно с try и except, именованные аргументы функций (на это также повлиял Common Lisp);
  • С, C++ — некоторые синтаксические конструкции (как пишет сам Гвидо ван Россум — он использовал наиболее непротиворечивые конструкции из С, чтобы не вызвать неприязнь у С-программистов к Python[22]);
  • 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], [HaikuOS], [AS/400] и даже [OS/390], [Windows Mobile], [Symbian] и [Android][24].

По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с серии 2.6 прекращена поддержка [Windows 95], [Windows 98] и [Windows ME][25]. Однако на этих платформах можно использовать предыдущие версии Python — на данный момент сообщество активно поддерживает версии Python начиная от 2.3 (для них выходят исправления).

При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft [COM]/[DCOM]). Более того, существует специальная версия Python для [виртуальной машины Java] — [Jython], что позволяет интерпретатору выполняться на любой системе, поддерживающей Java, при этом классы Java могут непосредственно использоваться из Python и даже быть написанными на Python. Также несколько проектов обеспечивают интеграцию с платформой [Microsoft .NET], основные из которых — [IronPython] и [Python.Net].

Типы и структуры данных

Python поддерживает [динамическую типизацию], то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». В Python имеются встроенные типы: [булевый], [строка], [Unicode]-строка, целое число произвольной точности, число [с плавающей запятой], [комплексное число] и некоторые другие. Из [коллекций] в Python встроены: [список], [кортеж] (неизменяемый список), [словарь], [множество] и другие[26]. Все значения являются объектами, в том числе функции, методы, модули, классы.

Добавить новый тип можно либо написав [класс] (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает [наследование] (одиночное и [множественное]) и [метапрограммирование]. Возможно наследование от большинства встроенных типов и типов расширений.

Все объекты делятся на ссылочные и атомарные. К атомарным относятся int, long (в версии 3 любое число int, так как в версии 3 нет ограничения на размер), complex и некоторые другие. При присваивании атомарных объектов копируется их значение, в то время как для ссылочных копируется только указатель на объект, таким образом, обе переменные после присваивания используют одно и то же значение. Ссылочные объекты бывают изменяемые и неизменяемые. Например, строки и кортежи являются неизменяемыми, а списки, словари и многие другие объекты — изменяемыми. Кортеж в Python является, по сути, неизменяемым списком. Во многих случаях кортежи работают быстрее списков[27], поэтому если вы не планируете изменять последовательность, то лучше использовать именно их.