{{Другие значения}}
{{Карточка языка программирования
|name = Python
|logo =Python logo and wordmark.svg
|semantics =-
|paradigm = [[Мультипарадигмальный язык программирования|мультипарадигмальный]]: [[Объектно-ориентированный язык программирования|объектно-ориентированный]], [[Отражение (программирование)|рефлективный]], [[Императивный язык программирования|императивный]], [[Функциональный язык программирования|функциональный]], [[Аспектно-ориентированное программирование|аспектно-ориентированный]], [[Динамический язык программирования|динамический]]
|class = [[Интерпретатор|интерпретируемый]], [[Компилятор|компилируемый]] в [[Common Intermediate Language|MSIL]], компилируемый в [[байт-код]] [[Java]]
|extension = .py, .pyw, .pyc, .pyo, .pyd
* .py — исходный код.
* .pyw — исходный код для выполнения программ с графическим интерфейсом в Windows, файлы с таким расширением будут выполнены без запуска консоли.
* .pyc — скомпилированный байт-код.
* .pyo — оптимизированный скомпилированный байт-код.
* .pyd — бинарный код динамических библиотек [[Динамически подключаемая библиотека|DLL]] (в Windows).
| latest_release_version = 3.5.0/ 2.7.10
| latest_release_date = [[13 сентября]] [[2015 год]]а[https://www.python.org/downloads/release/python-350/ Python Release Python 3.5.0] / 23 мая [[2015 год]]а[https://www.python.org/downloads/release/python-2710/ Python Release Python 2.7.10]
| latest_preview_version =
| latest_preview_date =
|typing = [[Строгая типизация|строгая]], [[Динамическая типизация|динамическая]]
|implementations = [[CPython]], [[Jython]], [[IronPython]], [[PyPy]], [[Stackless Python|Stackless]]
|dialects =
|influenced_by = [[ABC (язык программирования)|ABC]], [[Модула-3|Modula-3]], [[Lisp]], [[Tcl]], [[Smalltalk]], [[Си (язык программирования)|C]], [[Java]], [[Icon (язык программирования)|Icon]]
|influenced = [[Ruby]], [[Boo]], [[Groovy]], [[ECMAScript]], [[CoffeeScript]], [[Swift (язык программирования)|Swift]]
}}
[[Файл:PythonProgLogo.png|thumb|Логотип Python (1990—2005)]]
'''Python'''Создатель языка Гвидо ван Россум настаивает, что название происходит не от [[Питоны|рептилии]] и не от [[Пифон|мифического существа]], а от телевизионного шоу «[[Летающий цирк Монти Пайтона]]». См.: http://docs.python.org/faq/general#why-is-it-called-python, однако стилизованное изображение змеи давно стало неофициальным символом языка и является элементом официального логотипа. (МФА: {{IPA|[ˈpʌɪθ(ə)n]}}; в русском языке распространено название ''пито́н''[http://www.xakep.ru/magazine/xa/117/088/1.asp Мария «Mifrill» Нефедова, Создатели языков программирования: Они такие разные, но кодинг их объединяет, Хакер № 09/08 (117)]) — [[высокоуровневый язык программирования]] общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. [[Синтаксис (программирование)|Синтаксис]] ядра Python минималистичен. В то же время [[Стандартная библиотека Python|стандартная библиотека]] включает большой объём полезных функций.
Python поддерживает несколько [[Парадигма программирования|парадигм программирования]], в том числе [[структурное программирование|структурное]], [[объектно-ориентированное программирование|объектно-ориентированное]], [[функциональное программирование|функциональное]], [[императивное программирование|императивное]] и [[аспектно-ориентированное программирование|аспектно-ориентированное]]. Основные архитектурные черты — [[динамическая типизация]], [[сборка мусора (программирование)|автоматическое управление памятью]], полная [[Интроспекция (программирование)|интроспекция]], механизм [[обработка исключений|обработки исключений]], поддержка [[многопоточность|многопоточных вычислений]] и удобные высокоуровневые [[структура данных|структуры данных]]. Код в Python организовывается в функции и [[Класс (программирование)|классы]], которые могут объединяться в [[Модуль (программирование)|модули]] (они в свою очередь могут быть объединены в пакеты).
Эталонной реализацией Python является интерпретатор [[CPython]], поддерживающий большинство активно используемых платформ[http://www.python.org/about/ About Python]. Он распространяется под [[свободное программное обеспечение|свободной лицензией]] Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая [[проприетарное ПО|проприетарные]][http://www.python.org/2.5/license.html Python 2.5 license]. Есть реализации интерпретаторов для [[JVM]] (с возможностью [[Компилятор|компиляции]]), [[MSIL]] (с возможностью [[Компилятор|компиляции]]), [[LLVM]] и других. Проект [[PyPy]] предлагает реализацию Python на самом Python, что уменьшает затраты на изменения языка и постановку экспериментов над новыми возможностями.
Python — активно развивающийся [[язык программирования]], новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют [[Американский национальный институт стандартов|стандарт ANSI]], [[ISO]] или другие официальные стандарты, их роль выполняет [[CPython]].
== Философия ==
Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («[[Дзен]] Питона», или «Дзен Пайтона»)[http://www.python.org/peps/pep-0020.html PEP 20 — The Zen of Python]. Её текст выдаётся [[интерпретатор]]ом Python по команде import this (работает один раз за сессию). Автором этой философии считается [[Тим Петерс|Тим Петерс]] (Tim Peters).
Текст философии:
{{начало цитаты}}
* Красивое лучше, чем уродливое.
* Явное лучше, чем неявное.
* Простое лучше, чем сложное.
* Сложное лучше, чем запутанное.
* Плоское лучше, чем вложенное.
* Разреженное лучше, чем плотное.
* Читаемость имеет значение.
* Особые случаи не настолько особые, чтобы нарушать правила.
* При этом практичность важнее безупречности.
* Ошибки никогда не должны замалчиваться.
* Если не замалчиваются явно.
* Встретив двусмысленность, отбрось искушение угадать.
* Должен существовать один — и, желательно, ''только'' один — очевидный способ сделать это.
* Хотя он поначалу может быть и не очевиден, если вы не голландецШутливый намёк на Гвидо.
* Сейчас лучше, чем никогда.
* Хотя никогда зачастую лучше, чем ''прямо'' сейчас.
* Если реализацию сложно объяснить — идея плоха.
* Если реализацию легко объяснить — идея, ''возможно'', хороша.
* Пространства имён — отличная штука! Будем делать их побольше!
{{oq|en|
* 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!
}}{{конец цитаты}}
== История ==
{{main|История языка программирования Python}}
Разработка языка Python была начата в конце [[1980-е|1980-х годов]][http://www.artima.com/intv/pythonP.html The Making of Python] сотрудником голландского института CWI [[Гвидо ван Россум]]ом. Для распределённой ОС [[Amoeba (операционная система)|Amoeba]] требовался расширяемый [[Сценарный язык|скриптовый язык]], и Гвидо начал писать Python на досуге, позаимствовав некоторые наработки для языка [[ABC (язык программирования)|ABC]] (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале [[1991 год]]а Гвидо опубликовал исходный текст в [[Группа новостей|ньюсгруппе]] alt.sourceshttp://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY. С самого начала Python проектировался как [[объектно-ориентированный язык программирования|объектно-ориентированный язык]].
[[Файл:Python-icon.png|thumb|left|.py]]
Название языка произошло вовсе не от вида пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу [[1970-е|1970-х]] «[[Летающий цирк Монти Пайтона]]». Впрочем, всё равно название языка чаще ассоциируют именно со змеёй, нежели с передачей — [[пиктограмма|пиктограммы]] файлов в [[KDE]] или в [[Microsoft Windows]] и даже эмблема на сайте python.org (до выхода версии 2.5) изображают змеиные головы.
Наличие дружелюбного, отзывчивого сообщества пользователей считается наряду с дизайнерской интуицией Гвидо одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP ({{lang-en|Python Enhancement Proposal}}) — предложений по развитию Python[http://www.python.org/dev/peps/ Index of Python Enhancement Proposals (PEPs)].
[[3 декабря]] [[2008 год]]а[http://python.org/download/releases/3.0/ Python 3.0 Release], после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется [[Аббревиатура|сокращение]] Py3k). В Python 3000 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python. На сегодня поддерживаются обе ветви развития (Python 3.x и 2.x).
=== Влияние других языков на Python ===
Появившись сравнительно поздно, Python создавался под влиянием множества языков программирования:
* [[ABC (язык программирования)|ABC]] — отступы для группировки операторов, высокоуровневые структуры данных (map)[http://www.python.org/doc/essays/foreword/ Foreword for «Programming Python» (1st ed.)][http://www.artima.com/intv/python2.html The Making of Python] (Python фактически создавался как попытка исправить ошибки, допущенные при проектировании ABC);
* [[Модула-3|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 (язык программирования)|Icon]] — [[Python#Генераторы|генераторы]].
Большая часть других возможностей 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]]{{cite web|url=http://www.damonkohler.com/2008/12/python-on-android.html|title=Python on Android|publisher=www.damonkohler.com|accessdate=19 декабря 2009 |lang=en |archiveurl=http://www.webcitation.org/5w4n0S15k|archivedate=2011-01-28}}.
По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с серии 2.6 прекращена поддержка [[Windows 95]], [[Windows 98]] и [[Windows ME]]{{cite web|url=http://docs.python.org/whatsnew/2.6.html#port-specific-changes-windows|title=Port-Specific Changes: Windows|work=Python v2.6.1 documentation. What’s New in Python 2.6|publisher=Python Software Foundation|accessdate=11 декабря 2008 |lang=en |archiveurl=http://www.webcitation.org/5w4n1Glim|archivedate=2011-01-28}}. Однако на этих платформах можно использовать предыдущие версии Python — на данный момент сообщество активно поддерживает версии Python начиная от 2.3 (для них выходят исправления).
При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft [[Microsoft Component Object Model|COM]]/[[Microsoft Distributed Component Object Model|DCOM]]). Более того, существует специальная версия Python для [[Виртуальная машина Java|виртуальной машины Java]] — [[Jython]], что позволяет интерпретатору выполняться на любой системе, поддерживающей Java, при этом классы Java могут непосредственно использоваться из Python и даже быть написанными на Python. Также несколько проектов обеспечивают интеграцию с платформой [[Microsoft .NET]], основные из которых — [[IronPython]] и [[Python.Net]].
== Типы и структуры данных ==
Python поддерживает [[динамическая типизация|динамическую типизацию]], то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». В Python имеются встроенные типы: [[булевский тип|булевый]], [[строковый тип|строка]], [[Unicode]]-строка, целое число произвольной точности, число [[плавающая запятая|с плавающей запятой]], [[комплексное число]] и некоторые другие. Из [[коллекция (программирование)|коллекций]] в Python встроены: [[список (информатика)|список]], [[кортеж (информатика)|кортеж]] (''неизменяемый список''), [[ассоциативный массив|словарь]], [[множество]] и другие[http://docs.python.org/library/stdtypes.html Python Documentation — Built-in Types]. Все значения являются объектами, в том числе функции, методы, модули, классы.
Добавить новый тип можно либо написав [[Класс (программирование)|класс]] (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает [[Наследование (программирование)|наследование]] (одиночное и [[множественное наследование|множественное]]) и [[метапрограммирование]]. Возможно наследование от большинства встроенных типов и типов расширений.
Все объекты делятся на ссылочные и атомарные. К атомарным относятся int, long (в версии 3 любое число int, так как в версии 3 нет ограничения на размер), complex и некоторые другие. При присваивании атомарных объектов копируется их значение, в то время как для ссылочных копируется только указатель на объект, таким образом, обе переменные после присваивания используют одно и то же значение. Ссылочные объекты бывают изменяемые и неизменяемые. Например, строки и кортежи являются неизменяемыми, а списки, словари и многие другие объекты — изменяемыми. Кортеж в Python является, по сути, неизменяемым списком. Во многих случаях кортежи работают быстрее списков[http://stackoverflow.com/questions/68630/are-tuples-more-efficient-than-lists-in-python Are tuples more efficient than lists in Python? — Stack Overflow], поэтому если вы не планируете изменять последовательность, то лучше использовать именно их.
== Синтаксис и семантика ==
Язык обладает чётким и последовательным синтаксисом, продуманной модульностью и [[масштабируемость]]ю, благодаря чему исходный код написанных на Python программ легко читаем. При передаче аргументов в функции Python использует [[вызов по соиспользованию]] ({{lang-en2|call-by-sharing}}){{cite web
| title = Call By Object
| author = Fredrik Lundh
| work = effbot.org
| lang = {{ref-en}}
| url = http://effbot.org/zone/call-by-object.htm
}}.
{{seealso|:en:Python syntax and semantics}}
=== Операторы ===
Набор операторов достаточно традиционен. Вот некоторые из них:
* условный оператор if (если). Альтернативный блок после else (иначе). Если условий и альтернатив несколько, можно использовать elif (сокр. от else if).
* операторы цикла while (пока) и for (для). Внутри цикла возможно применение break и continue для прерывания цикла и перехода сразу к следующей итерации соответственно.
* оператор определения класса class.
* оператор определения функции, метода или генератора def. Внутри возможно применение return (возврат) для возврата из функции или метода, а в случае генератора — yield (давать).
* оператор обработки исключений try — except — else или try — finally (начиная с версии 2.5, можно использовать finally, except и else в одном блоке).
* оператор pass ничего не делает. Используется для пустых блоков кода.
Одной из интересных синтаксических особенностей языка является выделение [[блок (программирование)|блоков]] кода с помощью отступов (пробелов или табуляций), поэтому в Python отсутствуют [[операторные скобки]] begin/end, как в языке [[Паскаль (язык программирования)|Паскаль]], или фигурные скобки, как в [[Си (язык программирования)|Си]]. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Некоторым такое поведение может показаться неинтуитивным и неудобным.
=== Выражения ===
Выражение является полноправным оператором в Python. Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок.
Отдельно стоит упомянуть ''операцию форматирования'' для строк (работает по аналогии с printf() из Си), которая использует тот же символ, что и взятие остатка от деления:
Python имеет удобные ''цепочечные сравнения''. Такие условия в программах — не редкость:
Кроме того, логические операции (or и and) являются [[Ленивые вычисления|ленивыми]]: если для вычисления значения операции достаточно первого операнда, этот операнд и является результатом, в противном случае вычисляется второй операнд логической операции. Это основывается на свойствах [[Алгебра логики|алгебры логики]]: например, если один аргумент операции «ИЛИ» (or) является истиной, то и результат этой операции всегда является истиной. В случае, если второй операнд является сложным выражением, это позволяет сократить издержки на его вычисление. Этот факт широко использовался до версии 2.5 вместо условной конструкции:
Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант):
Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза s[N:M] означает, что в срез попадают все элементы от N включительно до M не включая. В качестве иллюстрации можно посмотреть [[v:Примеры программ на языке Python#Примеры работы с последовательностями|пример работы с последовательностями]].
=== Имена ===
Имя (идентификатор) может начинаться с латинской буквы (В Python 3 — буквы любого алфавита в Юникоде, например кириллицы) любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по import keyword; print keyword.kwlist, для версии 3 import keyword; print(keyword.kwlist)) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение{{cite web|url=http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers|title=2.3.2. Reserved classes of identifiers |work=Python documentation|date=18 октября 2009|archiveurl=http://www.webcitation.org/5w4n2As6O |archivedate=2011-01-28}}.
В каждой точке программы интерпретатор имеет доступ к трём [[пространство имён (программирование)|пространствам имён]] (то есть отображениям имён в объекты): локальному, глобальному и встроенному.
''Области видимости'' имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.
=== Строки документации ===
Python предлагает механизм [[Техническая документация|документирования]] кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — ''{{не переведено|:en:docstring|docstring}}''. Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации[http://softwaremaniacs.org/blog/2005/12/08/django/ …целостность больших проектов на Python строится на двух вещах: тесты и doc-строка](переменная __doc__), что используется современными IDE (например, [[Eclipse (среда разработки)|Eclipse]]).
В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить ''{{не переведено|:en:doctest|doctest}}'' для автоматического тестирования модуля.
=== Директивы ===
Начиная с Python 2.3, для использования в тексте программы символов, не входящих в ASCII, необходимо явно указывать кодировку исходного кода в начале модуля, например:
После этого можно использовать, например, кириллицу в Unicode-литералах. Но на самом деле, даже если вы напишете:
То Python «поймёт», что вы хотели сделать.
== Возможности ==
=== Интерактивный режим ===
Подобно [[Лисп]]у и [[Пролог (язык программирования)|Прологу]] в режиме отладки, интерпретатор Python имеет интерактивный режим работы, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран ([[REPL]]). Этот режим интересен не только новичкам, но и опытным программистам, которые могут протестировать в интерактивном режиме любой участок кода, прежде чем использовать его в основной программе, или просто использовать как [[калькулятор]] с большим набором функций.
Так выглядит общение с Python в интерактивном режиме:
В интерактивном режиме доступен [[отладчик]] pdb и система помощи (вызывается по help()). Система помощи работает для модулей, классов и функций, только если те были снабжены строками документации.
Кроме встроенной, существуют и улучшенные интерактивные оболочки [[IPython]]http://ipython.scipy.org/ и [[bpython]][http://www.bpython-interpreter.org/ bpython interpreter].
=== Объектно-ориентированное программирование ===
{{main|Объектно-ориентированное программирование на Python}}
Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация [[Объектно-ориентированное программирование|ООП]] в Python является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими [[Объектно-ориентированный язык программирования|объектно-ориентированными языками]].
Возможности и особенности:
# Классы являются одновременно объектами со всеми ниже приведёнными возможностями.
# Наследование, в том числе множественное.
# Полиморфизм (все функции виртуальные).
# Инкапсуляция (два уровня — общедоступные и скрытые методы и поля). Особенность — скрытые члены доступны для использования и помечены как скрытые лишь особыми именами.
# Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.
# Перегрузка операторов (всех, кроме is, '.', '=' и символьных логических).
# Свойства (имитация поля с помощью функций).
# Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).
# Методы для управления наиболее распространёнными операциями (истинностное значение, len(), глубокое копирование, [[сериализация]], итерация по объекту, …)
# Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.)
# Полная [[Интроспекция (программирование)|интроспекция]].
# Классовые и статические методы, классовые поля.
# Классы, вложенные в функции и классы.
=== Функциональное программирование ===
{{main|Функциональное программирование на Python}}
Python поддерживает парадигму [[функциональное программирование|функционального программирования]], в частности:
* функция является объектом
* функции высших порядков
* рекурсия
* развитая обработка списков (списочные выражения, операции над последовательностями, итераторы)
* аналог замыканий
* частичное применение функции
* возможность реализации других средств на самом языке (например, [[карринг]])
=== Модули и пакеты ===
Программное обеспечение (приложение или библиотека) на Python оформляется в виде [[Модуль (программирование)|модулей]], которые в свою очередь могут быть собраны в ''пакеты''. Модули могут располагаться как в [[Каталог (файловая система)|каталогах]], так и в [[ZIP|ZIP-архивах]]. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Python, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором import. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией reload().
=== Интроспекция ===
{{main|Интроспекция в Python}}
Python поддерживает полную [[Интроспекция (программирование)|интроспекцию]] времени исполнения. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.
Применение интроспекции является важной частью того, что называют [[pythonic style]], и широко применяется в библиотеках и [[фреймворк]]ах Python, таких как PyRO, PLY, Cherry, [[Django]] и др., значительно экономя время использующего их программиста.
=== Обработка исключений ===
[[Обработка исключений]] поддерживается в Python посредством операторов try, except, else, finally, raise, образующих блок обработки исключения. В общем случае блок выглядит следующим образом:
Совместное использование else, except и finally стало возможно только начиная с Python 2.5. Информация о текущем исключении всегда доступна через sys.exc_info(). Кроме значения исключения, Python также сохраняет состояние стека вплоть до точки возбуждения исключения — так называемый traceback.
В отличие от компилируемых языков программирования, в Python использование исключения не приводит к значительным накладным расходам (а зачастую даже позволяет ускорить исполнение программ) и очень широко используется. Исключения согласуются с философией Python (10-й пункт «[[#Философия|дзена Python]]» — «Ошибки никогда не должны умалчиваться») и являются одним из средств поддержки «[[Утиная типизация|утиной типизации]]».
Иногда вместо явной обработки исключений удобнее использовать блок [[Python#Управление контекстом выполнения|with]] (доступен, начиная с Python 2.5).
=== Итераторы ===
В программах на Python широко используются [[Итератор (программирование)|итераторы]]. Цикл for может работать как с последовательностью, так и с итератором. Все коллекции, как правило, предоставляют итератор. Объекты определённого пользователем класса тоже могут быть итераторами. Подробнее об итераторах можно узнать [[Функциональное программирование на Питоне#Итераторы|в разделе о функциональном программировании]]. Модуль itertools стандартной библиотеки содержит много полезных функций для работы с итераторами.
=== Генераторы ===
Одной из интересных возможностей языка являются '''генераторы''' — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию (см. также: [[сопрограмма|сопрограммы]]). Генераторы могут использоваться как [[Итератор (программирование)|итераторы]] для структур данных и для [[ленивые вычисления|ленивых вычислений]]. См. пример: [[v:Примеры программ на языке Python#Генератор чисел Фибоначчи|генератор чисел Фибоначчи]].
При вызове генератора функция немедленно возвращает объект-итератор, который хранит текущую точку исполнения и состояние локальных переменных функции. При запросе следующего значения (посредством метода next(), неявно вызываемого в цикле for) генератор продолжает исполнение функции от предыдущей точки останова до следующего оператора yield или return.
В Python 2.4 появились '''генераторные выражения''' — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами:
В этом примере суммируются все нечётные числа от 1 до 99.
Начиная с версии 2.5, Python поддерживает полноценные сопроцедуры: теперь в генератор можно передавать значения с помощью метода send() и возбуждать в его контексте исключения с помощью метода throw().
=== Управление контекстом выполнения ===
В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор with и модуль contextlib. См.: [[v:Примеры программ на языке Python#Управление контекстом выполнения|пример]].
Оператор может применяться в тех случаях, когда до и после некоторых действий должны обязательно выполняться некоторые другие действия, независимо от возбуждённых в блоке исключений или операторов return: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки.
=== Декораторы ===
Начиная с версии 2.4, Python позволяет использовать т. н. ''декораторы''[http://www.python.org/dev/peps/pep-0318/ PEP318] (не следует путать с [[Декоратор (шаблон проектирования)|одноимённым]] [[Шаблоны проектирования|шаблоном проектирования]]) для поддержки существующей практики преобразования функций и методов в месте определения (декораторов может быть несколько). Для декораторов используется символ @ в строках, предшествующих определению функции или метода. Синтаксис декорирования является [[синтаксический сахар|синтаксическим сахаром]] для удобочитаемости: код
полностью эквивалентен
Сам декоратор является функцией, получающей в качестве первого аргумента декорируемую функцию. Для передачи дополнительных аргументов можно использовать синтаксис @декоратор(аргументы). Декораторы можно считать элементом [[аспектно-ориентированное программирование|аспектно-ориентированного программирования]].
С версии 2.6 декораторы можно использовать с классами аналогично функциям.
=== Другие возможности ===
В Python есть ещё несколько возможностей, отличающих его от многих других языков высокой гибкостью и динамичностью.
Например, класс является объектом, а в операторе определения класса можно использовать выражения в списке родительских классов.
Можно модифицировать многие объекты во время исполнения, например классы:
== Библиотеки ==
=== Стандартная библиотека ===
{{main|Стандартная библиотека Python}}
[[Файл:Python batteries included.jpg|thumb| Python поставляется «[[Стандартная библиотека Python|с батарейками в комплекте]]».]]
Богатая стандартная [[Библиотека (программирование)|библиотека]] является одной из привлекательных сторон Python. Здесь имеются средства для работы со многими [[Сетевой протокол|сетевыми протоколами]] и форматами [[Интернет]]а, например, модули для написания [[HTTP-сервер]]ов и клиентов, для разбора и создания почтовых сообщений, для работы с [[XML]] и т. п. Набор модулей для работы с [[операционная система|операционной системой]] позволяет писать кросс-платформенные приложения. Существуют модули для работы с [[регулярное выражение|регулярными выражениями]], текстовыми [[кодировка]]ми, [[мультимедиа|мультимедийными]] форматами, [[криптография|криптографическими]] протоколами, архивами, [[Сериализация|сериализации]] данных, поддержка [[Юнит-тестирование|юнит-тестирования]] и др.
=== Модули расширения и программные интерфейсы ===
Помимо стандартной библиотеки существует множество библиотек, предоставляющих интерфейс ко всем системным вызовам на разных платформах; в частности, на платформе Win32 поддерживаются все вызовы [[Win32 API]], а также [[Component Object Model|COM]] в объёме не меньшем, чем у [[Visual Basic]] или [[Delphi (язык программирования)|Delphi]]. Количество прикладных библиотек для Python в самых разных областях без преувеличения огромно ([[Всемирная паутина|веб]], [[База данных|базы данных]], обработка изображений, обработка текста, [[численные методы]], приложения [[операционная система|операционной системы]] и т. д.).
Для Python принята спецификация программного интерфейса к базам данных [[DB-API 2]] и разработаны соответствующие этой спецификации пакеты для доступа к различным [[СУБД]]: [[Oracle Database|Oracle]], [[MySQL]], [[PostgreSQL]], [[Sybase]], [[Firebird]] ([[Interbase]]), [[Informix]], [[Microsoft SQL Server]] и [[SQLite]]. На платформе [[Windows]] доступ к БД возможен через [[ADO]] ([[ADOdb]]). Коммерческий пакет mxODBC для доступа к СУБД через [[ODBC]] для платформ Windows и [[UNIX]] разработан eGenix[http://egenix.com/ eGenix.com — Professional Python Software, Skills and Services]. Для Python написано много [[ORM]] ([[SQLObject]], [[SQLAlchemy]], Dejavu, [[Django]]), выполнены программные каркасы для разработки веб-приложений ([[Django]], [[Pylons]], [[Pyramid (программный каркас)|Pyramid]]).
Библиотека [[NumPy]] для работы с многомерными [[массив (программирование)|массивами]] позволяет достичь производительности научных расчётов, сравнимой со специализированными пакетами. [[SciPy]] использует NumPy и предоставляет доступ к обширному спектру математических алгоритмов (матричная алгебра — [[BLAS]] уровней 1—3, [[LAPACK]], [[Быстрое преобразование Фурье|БПФ]]…). Numarray[http://www.stsci.edu/resources/software_hardware/numarray numarray Home Page] специально разработан для операций с большими объёмами научных данных.
[[WSGI]][http://www.python.org/dev/peps/pep-0333/ PEP333] — интерфейс шлюза с веб-сервером (Python Web Server Gateway Interface).
Python предоставляет простой и удобный программный интерфейс [[C API]] для написания собственных модулей на языках [[Си (язык программирования)|Си]] и [[C++]]. Такой инструмент как [[SWIG]] позволяет почти автоматически получать привязки для использования C/C++ библиотек в коде на Python. Возможности этого и других инструментов варьируются от автоматической генерации (C/C++/Fortran)-Python интерфейсов по специальным файлам (SWIG, pyste[http://www.boost.org/libs/python/pyste/index.html Pyste Documentation], SIPhttp://www.riverbankcomputing.co.uk/sip/, pyforthttp://pyfortran.sourceforge.net/), до предоставления более удобных API (boost::python[http://www.boost.org/libs/python/doc/ Boost.Python], CXX[http://cxx.sourceforge.net/ PyCXX: Write Python Extensions in C], Pyhrol[http://pyhrol.ru/ Мост между C++ и Python] и др.). Инструмент стандартной библиотеки [[ctypes]] позволяет программам Python напрямую обращаться к [[динамическая библиотека|динамическим библиотекам]]/[[DLL]], написанным на Си. Существуют модули, позволяющие встраивать код на С/C++ прямо в исходные файлы Python, создавая расширения «на лету» (pyinline[http://pyinline.sourceforge.net/ PyInline: Mix Other Languages directly Inline with your Python], weave[http://www.scipy.org/Weave Weave]).
Другой подход состоит во встраивании интерпретатора Python в приложения. Python легко встраивается в программы на Java, C/C++, [[Ocaml]]. Взаимодействие Python-приложений с другими системами возможно также с помощью [[CORBA]], [[XML-RPC]], [[SOAP]], COM.
С помощью проекта [[Cython]] возможна трансляция программ написанных на языках Python и {{translation|:en:Pyrex (programming language)|Pyrex}} в код на языке Си, с последующей компиляцией в машинный код. Cython используется для упрощения написания Python-библиотек, при его использовании отмечается ускорение кода и уменьшение накладных расходов.
Экспериментальный проект [[Shedskin]] предполагает создание компилятора для трансформации неявно типизированных Python программ в оптимизированный С++ код. Начиная с версии 0.22 Shedskin позволяет компилировать отдельные функции в модули расширений.
Python и подавляющее большинство библиотек к нему бесплатны и поставляются в исходных кодах. Более того, в отличие от многих открытых систем, лицензия никак не ограничивает использование Python в коммерческих разработках и не налагает никаких обязательств кроме указания авторских прав.
Одним из каналов распространения и обновления пакетов для Python является [[PyPI]] ({{lang-en|Python Package Index}}).
=== Графические библиотеки ===
С Python поставляется библиотека [[tkinter]] на основе [[Tcl]]/[[Tk]] для создания кроссплатформенных программ с [[GUI|графическим интерфейсом]].
Существуют расширения, позволяющие использовать все основные библиотеки графических интерфейсов — [[wxPython]][http://www.wxpython.org/ wxPython], основанное на библиотеке [[wxWidgets]], [[PyGTK]] для [[Gtk]], [[PyQt]] и [[PySide]] для [[Qt]] и другие. Некоторые из них также предоставляют широкие возможности по работе с базами данных, графикой и сетями, используя все возможности библиотеки, на которой основаны.
Для создания игр и приложений, требующих нестандартного интерфейса, можно использовать библиотеку [[Pygame]]. Она также предоставляет обширные средства работы с [[мультимедиа]]: с её помощью можно управлять звуком и изображениями, воспроизводить видео. Предоставляемое pygame аппаратное ускорение графики [[OpenGL]] имеет более высокоуровневый интерфейс по сравнению с PyOpenGL[http://pyopengl.sourceforge.net/ PyOpenGL — The Python OpenGL Binding], копирующей семантику С-библиотеки для OpenGL. Есть также PyOgre[http://www.ogre3d.org/wiki/index.php/PyOgre PyOgre : Ogre Wiki], обеспечивающая привязку к [[Ogre]] — высокоуровневой объектно-ориентированной библиотеке 3D-графики. Кроме того, существует библиотека pythonOCC[http://www.pythonocc.org/ pythonOCC, 3D CAD/CAE/PLM development framework for the Python programming language], обеспечивающая привязку к среде 3D-моделирования и симуляции OpenCascade[http://www.opencascade.org/ Open CASCADE Technology, 3D modeling & numerical simulation].
Для работы с [[Растровая графика|растровой графикой]] используется библиотека [[Python Imaging Library]].
=== Контроль типов и перегрузка функций ===
Существуют модули, позволяющие контролировать типы параметров функций на этапе исполнения, например, typecheck[http://oakwinter.com/code/typecheck/ Typechecking module for Python] или method signature checking decorators[http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/426123 Method signature checking decorators " Python recipes " ActiveState Code]. Необязательная декларация типов для параметров функции добавлена в Python 3, интерпретатор при этом не проверяет типы, а только добавляет соответствующую информацию к метаданным функции для последующего использования этой информации модулями расширений.[http://www.python.org/dev/peps/pep-3107/ PEP-3107]
Перегрузка функций реализована различными сторонними библиотеками, в том числе PEAK[http://peak.telecommunity.com/DevCenter/FrontPage FrontPage — The PEAK Developers' Center][http://peak.telecommunity.com/DevCenter/RulesReadme PEAK-Rules]. Не принятые планы по поддержке перегрузки в Python3000[http://www.python.org/dev/peps/pep-3124/ PEP-3124] были частично реализованы в библиотеке overloading-lib[http://code.google.com/p/overloading-lib/ overloading-lib], Библиотека динамической перегрузки функций и методов основанной на типах аргументов для языка python.
== Примеры программ ==
В статье «[[v:Примеры программ на языке Python|Примеры программ на языке Python]]» собраны примеры небольших программ, демонстрирующих некоторые возможности языка Python и его стандартной библиотеки.
== Профилирование и оптимизация кода ==
В стандартной библиотеке Python имеется [[Профилирование (информатика)|профайлер]] (модуль '''profile'''), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модуль timeit. Производимые в следующей программе измерения позволяют выяснить, какой из вариантов [[Конкатенация|конкатенации]] строк более эффективен:
Как и в любом языке программирования, в Python имеются свои приёмы [[оптимизация (информатика)|оптимизации]] кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг с другом) критериев (увеличение быстродействия, уменьшение объёма требуемой оперативной памяти, компактность исходного кода и т. д.). Чаще всего программы оптимизируют по времени исполнения.
Здесь есть несколько очевидных правил:
* Не нужно оптимизировать программу, если скорость её выполнения достаточна.
* Используемый алгоритм имеет определённую [[Временная сложность алгоритма|временную сложность]], поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм.
* Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Python есть встроенная функция '''sort()'''.
* Профилирование поможет выяснить узкие места. Оптимизацию нужно начинать с них.
Python имеет следующие особенности и связанные с ними правила оптимизации:
* Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обработка той же последовательности в цикле вызовом функции.
* Старайтесь вынести из глубоко вложенного цикла всё, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным, или чем доступ к полям.
* Оптимизатор '''psyco''' может помочь ускорить работу модуля программы при условии, что модуль не использует динамических свойств языка Python.
* В случае, если модуль проводит массированную обработку данных и оптимизация алгоритма и кода не помогает, можно переписать [[Критический участок кода|критические участки]], скажем, на языке Си или Pyrex.
Инструмент под названием Pychecker[http://pychecker.sourceforge.net/ PyChecker: a python source code checking tool] поможет проанализировать исходный код на Python и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint[http://www.logilab.org/view?rql=Any%20X%20WHERE%20X%20eid%20857 pylint (analyzes Python source code looking for bugs and signs of poor quality.) (Logilab.org)] призван решать близкие задачи, но имеет уклон в сторону проверки стиля кода, поиска [[код с запашком|кода с запашком]][http://docs.pylint.org/intro.html Pylint 1.0.0 documentation, Introduction].
== Сравнение с другими языками ==
Наиболее часто Python сравнивают с [[Perl]] и [[Ruby]]. Эти языки также являются [[Интерпретируемый язык программирования|интерпретируемыми]] и обладают примерно одинаковой скоростью выполнения программ. Как и Perl, Python может успешно применяться для написания скриптов (сценариев). Как и Ruby, Python является хорошо продуманной системой для [[Объектно-ориентированное программирование|ООП]].
Средства [[функциональное программирование|функционального программирования]] частично позаимствованы из [[Scheme]] и [[Icon (язык программирования)|Icon]].
В среде коммерческих приложений скорость выполнения программ на Python часто сравнивают с [[Java]]-приложениями[http://shootout.alioth.debian.org/ Результаты одной из попыток сравнения].
Несмотря на то, что Python обладает достаточно самобытным синтаксисом, одним из принципов дизайна этого языка является [[Правило наименьшего удивления|принцип наименьшего удивления]].
=== Недостатки ===
См. также список распространённых недоразумений при использовании языка Python[https://web.archive.org/web/20130810230937/http://zephyrfalcon.org/labs/python_pitfalls.html zephyrfalcon.org :: labs :: 10 Python pitfalls].
==== Низкое быстродействие ====
Классический Python, как и многие другие [[Интерпретируемый язык программирования|интерпретируемые языки]], не применяющие, например, [[JIT]]-компиляторы, имеют общий недостаток — сравнительно невысокую скорость выполнения программ{{cite web|url=http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=python&lang2=gpp&box=1|title=Python / C++ GNU g++|work=Computer Language Benchmarks Game|publisher=???|accessdate=1 июля 2009|archiveurl=http://www.webcitation.org/5w4n30Deb|archivedate=2011-01-28}}. Сохранение [[байт-код]]а (расширения .pyc и .pyo, начиная с версии 3.5 расширения .pyo больше нет) позволяет интерпретатору не тратить лишнее время на перекомпиляцию кода модулей при каждом запуске. Кроме того, существует специальная JIT-библиотека psyco[http://psyco.sf.net/ Psyco]{{ref-en}} — JIT-компилятор для Python, позволяющий увеличить скорость работы программ в 3-10 раз, позволяющая ускорить выполнение программ (однако приводящая к увеличению потребления оперативной памяти). Эффективность psyco сильно зависит от архитектуры программы.
Существуют реализации языка Python, вводящие высокопроизводительные виртуальные машины (ВМ) в качестве бэк-энда компилятора. Примерами таких реализаций может служить [[PyPy]], базирующийся на LLVM; более ранней инициативой является проект [[Parrot]]. Ожидается, что использование ВМ типа LLVM приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где низкая вычислительная производительность в основном преодолена{{cite web|url=http://code.google.com/p/unladen-swallow/wiki/ProjectPlan|title=unladen-swallow. A faster implementation of Python|publisher=code.google|accessdate=22 июня 2009|quote=Goals: … Produce a version of Python at least 5x faster than CPython|archiveurl=http://www.webcitation.org/5w4n3soB7|archivedate=2011-01-28}}.
Множество программ/библиотек для интеграции с другими языками программирования (см. выше) предоставляют возможность использовать другой язык для написания критических участков.
В самой популярной реализации языка Python интерпретатор довольно велик и более требователен к ресурсам, чем в аналогичных популярных реализациях [[Tcl]], [[Forth]], [[LISP]] или [[Lua]], что ограничивает его применение во встроенных системах. Тем не менее, Python нашёл применение в [[Карманный персональный компьютер|КПК]] и некоторых моделях мобильных телефонов[http://wiki.opensource.nokia.com/projects/PyS60 Python for S60 — OpenSource].
==== Невозможность модификации встроенных классов ====
По сравнению с [[Ruby]] и некоторыми другими языками, в Python отсутствует возможность модифицировать встроенные классы, такие, как int, str, float, list и другие, что, однако, позволяет Python потреблять меньше оперативной памяти и быстрее работать. Ещё одной причиной введения такого ограничения является необходимость согласования с модулями расширения. Многие модули (в целях оптимизации быстродействия) преобразуют Python-объекты элементарных типов к соответствующим Си-типам вместо манипуляций с ними посредством Си-API. Также это избавляет от многих потенциальных ошибок при неконтролируемом динамическом переопределении встроенных типов.
==== Глобальная блокировка интерпретатора (GIL) ====
{{main|Global Interpreter Lock}}
GIL (Global Interpreter Lock) — особенность, присущая [[CPython]], [[Stackless Python|Stackless]] и [[PyPy]], но отсутствующая в [[Jython]] и [[IronPython]]. При своей работе основной интерпретатор Python постоянно использует большое количество потоко-небезопасных данных. В основном это словари, в которых хранятся атрибуты объектов, и обращения к внешнему коду (написанному на С и т. п.). Во избежание разрушения этих данных при совместной модификации из разных потоков, перед началом исполнения нескольких инструкций (по умолчанию 100) поток интерпретатора захватывает GIL, а по окончании освобождает. Вследствие этого, в каждый момент времени в одном процессе интерпретатора Python может исполняться только один поток кода на Python, даже если в компьютере имеется несколько процессоров или процессорных ядер (GIL также освобождается на время выполнения блокирующих операций, таких как ввод-вывод, изменения/проверка состояния синхронизирующих примитивов и других — таким образом, если один поток блокируется, другие могут исполняться). Была предпринята попытка перехода к более гранулированным синхронизациям, однако из-за частых захватов/освобождений блокировок эта реализация оказалась слишком медленной на однопоточных приложениях[http://www.artima.com/weblogs/viewpost.jsp?thread=211200 Python 3000 FAQ]. В ближайшем будущем переход от GIL к другим техникам не предполагается по причине того, что, по мнению автора языка Python Гвидо Россума, однопоточных программ, ускоряемых GIL, больше, чем многопоточных, которые GIL тормозит. Однако есть python-safethread[http://code.google.com/p/python-safethread/ python-safethread — Project Hosting on Google Code] — CPython без GIL и с некоторыми другими изменениями (по утверждениям его авторов, на однопоточных приложениях скорость соответствует 60-65 % от скорости оригинального CPython).
Эта проблема имеет два основных варианта решения. Первый — отказ от совместного использования изменяемых данных и вызовов внешнего кода. При этом данные дублируются в потоках и необходимость обеспечения их синхронизации (если таковая нужна) лежит на программисте[http://perldoc.perl.org/perlthrtut.html perlthrtut — perldoc.perl.org]. Этот подход ведёт к увеличению потребления оперативной памяти (однако не настолько сильно, как при использовании процессов в Windows — так как для Unix это не критично, процессы небольшие).
Второй подход — обеспечение более гранулированной синхронизации — для отдельных структур данных. В этом случае падает производительность вследствие увеличения числа освобождений/захватов блокировок.
Если необходимо параллельное исполнение нескольких потоков кода на Python, то можно воспользоваться процессами, например, модулем processing[http://pypi.python.org/pypi/processing Python Package Index : processing 0.52], который имитирует семантику стандартного модуля threading, но использует процессы вместо потоков. Начиная с версии 2.6, модуль processing добавлен в стандартную библиотеку и переименован в multiprocessing. Есть множество модулей, упрощающих написание параллельных и/или распределённых приложений на Python, таких как parallelpython[http://www.parallelpython.com/ Parallel Python — Home], Pyparhttp://datamining.anu.edu.au/~ole/pypar/, pympi[http://pympi.sourceforge.net/ pyMPI.sourceforge.net: Putting the py in MPI] и других. GIL освобождается при исполнении кода большинства расширений, например, [[NumPy]]/[[SciPy]], позволяя во время расчётов исполняться другому потоку. Другим решением может быть использование IronPython или Jython, лишённых этой особенности классического Python.
В версии 3.2 был внедрён изменённый GIL[http://docs.python.org/dev/whatsnew/3.2.html#multi-threading What’s New In Python 3.2 — Python v3.2b2 documentation][http://mail.python.org/pipermail/python-dev/2009-October/093321.html [Python-Dev] Reworking the GIL]. Основные нововведения:
* Переключение по таймауту, а не по количеству опкодов — в предыдущей версии GIL освобождался через каждые 100 операций. Но операция может выполняться от наносекунд, до долей секунд. В новой версии блокировка будет сниматься каждые 5 миллисекунд;
* Уменьшение накладных расходов и увеличение эффективности в случае частых переключений — в некоторых системах (в основном в [[MacOS X]]) наблюдаются проблема с эффективностью блокировки, когда GIL уже захвачен: системные вызовы становятся дорогими. В новой версии задержки будут уменьшены;
* Уменьшение задержек при переключении потоков благодаря введению механизма принудительного переключения потока и приоритетных запросов (когда поток выполняет приоритетный запрос, то GIL освобождается как можно быстрее).
== Реализации ==
[[CPython]] является основной, но не единственной реализацией языка программирования Python. Существуют также следующие реализации:
[[Jython]] — реализация Python, использующая [[JVM]] в качестве среды исполнения. Позволяет прозрачно использовать [[Java]]-библиотеки.[http://www.jython.org/ The Jython Project]
[[Python for S60|PyS60]] — реализация языка для [[смартфон]]ов фирмы [[Nokia]] на платформе [[Symbian S60|Series 60]].
[[IronPython]] — Python для [[.NET Framework]] и [[Mono]]. Компилирует Python программы в [[MSIL]], таким образом предоставляя полную интеграцию с .NET-системой[http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython IronPython].
[[Stackless Python|Stackless]] — также написанная на Си реализация Python. Это не полноценная реализация, а [[патч]]и к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину [[рекурсия|рекурсии]].
[[Python for .NET]][http://pythonnet.sourceforge.net/ Python for .NET] — ещё одна реализация Python для .NET. В отличие от IronPython эта реализация не компилирует Python код в MSIL, а только предоставляет интерпретатор, написанный на [[C Sharp|C#]]. Позволяет использовать .NET-сборки из Python кода.
[[PyPy]] — реализация Python, написанная на Python. Позволяет легко проверять новые возможности. В PyPy кроме стандартного CPython включены возможности Stackless, [[Psyco]], модификация [[Абстрактное синтаксическое дерево|AST]] «на лету» и многое другое. В проект интегрированы возможности анализа Python кода и трансляция в другие языки и [[байткод]]ы виртуальных машин ([[Си (язык программирования)|Си]], [[LLVM]], [[Javascript]], .NET с версии 0.9.9). Начиная с 0.9.0, возможна полностью автоматическая трансляция интерпретатора на Си, в результате чего достигается скорость, приемлемая для использования (в 2—3 раза медленнее чем CPython при отключённом [[JIT]] для версии 0.9.9). JIT находится в активной доработке.
[[python-safethread]] — версия CPython без [[#Глобальная блокировка интерпретатора (GIL)|GIL]], что позволяет одновременно исполнять Python потоки на всех доступных процессорах. Внесены также некоторые другие изменения.
[[Unladen Swallow]] — начатый [[Google (компания)|Google]] проект по разработке высокоэффективного, максимально совместимого с CPython JIT-компилятора на базе [[LLVM]]. Согласно планам по развитию Python[http://www.python.org/dev/peps/pep-3146/ PEP 3146 — Merging Unladen Swallow into CPython], планировалось перенести исходный код Unladen Swallow в CPython в версии 3.3. Но PEP-3146 был отменён в связи с отсутствием интереса к Unladen Swallow со стороны Google, основного спонсора разработки.[http://qinsb.blogspot.com/2011/03/unladen-swallow-retrospective.html QINSB is not a Software Blog: Unladen Swallow Retrospective]
[[tinypy]][http://www.tinypy.org/ tinypy :: home] — минималистическая версия Python. Часть возможностей CPython не реализована.
[[Micro Python]] — эффективная реализация Python 3 для встроенных систем с малым объёмом оперативной памяти.[http://micropython.org/ Micro Python]
[[Python for S60|Brython]]{{Cite web|url = http://www.brython.info/|title = Сайт проекта Brython|author = |date = |publisher = }} — реализация языка на клиентском JavaScript, позволяющая писать браузерные скрипты на Python 3.
[[QPython]]{{Cite web|url = http://qpython.com/|title = Сайт проекта QPython}} — Реализация python для Android. Проект все-еще на стадии тестирования, однако, на qpython уже портированы некоторые самые необходимые библиотеки. Позволяет и работать в интерактивном режиме. Существует, также, Qpython3.
== Дальнейшая разработка ==
[[Python Enhancement Proposal]] («PEP») — это документ со стандартизированным дизайном, предоставляющий общую информацию о языке Python, включая новые предложения, описания и разъяснения возможностей языка. PEP предлагаются как основной источник для предложения новых возможностей и для разъяснения выбора того или иного дизайна для всех основных элементов языка. Выдающиеся PEP рецензируются и комментируются [[Гвидо ван Россум]]ом, имеющим в проекте статус «[[Великодушный пожизненный диктатор|великодушного пожизненного диктатора]]».
=== График и совместимость ===
Серии Python 2.x и Python 3.x в течение нескольких выпусков будут существовать параллельно, при этом серия 2.x будет использоваться для совместимости и скорее всего в неё будут включены некоторые возможности серии 3.x. PEP 3000 содержит больше информации о планируемых выпусках.
Python 3.0 обратно не совместим с предыдущей серией 2.x. Код Python 2.x скорее всего будет выдавать ошибки при исполнении в Python 3.0. Динамическая типизация Python вместе с планами изменения нескольких методов словарей делает механический перевод из Python 2.x в Python 3.0 очень сложным. Однако, утилита «2to3» уже способна сделать большинство работы по переводу кода, указывая на подозрительные его части с помощью комментариев и предупреждений. PEP 3000 рекомендует держать исходный код для серии 2.x и делать выпуски для Python 3.x с помощью «2to3». Полученный код не следует редактировать, пока программа не будет работоспособной в Python 2.x.
=== Возможности ===
Основные изменения, внесённые в версии 3.0:[http://docs.python.org/dev/3.0/whatsnew/3.0.html What’s New In Python 3.0 — Python v3.0.1 documentation][http://docs.python.org/3.0/index.html Overview — Python v3.0.1 documentation]
* Синтаксическая возможность для аннотации параметров и результата функций (например, для передачи информации о типе или документирования).
* Полный переход на [[unicode]] для строк.
* Введение нового типа «неизменяемые байты» и типа «изменяемый буфер». Оба необходимы для представления бинарных данных.
* Новая подсистема ввода-вывода (модуль io), имеющая отдельные представления для бинарных и текстовых данных.
* [[Абстрактный класс|Абстрактные классы]], [[Абстрактный метод|абстрактные методы]] (доступно уже в 2.6).
* Иерархия типов для чисел.
* Выражения для словарей и множеств {k: v for k, v in a_dict} и {el1, el2, el3} (по аналогии со списковыми выражениями).
* Изменения print из встроенного выражения во встроенную функцию. Это позволит модулям делать изменения, подстраиваясь под разное использование функции, а также упростит код. В Python 2.6 эта возможность активируется вводом from __future__ import print_function.
* Перемещение reduce (но не map или filter) из встроенного пространства в модуль functools (использование reduce существенно менее читабельно по сравнению с циклом).
* Удаление некоторых устаревших возможностей, поддерживаемых в ветке 2.x для совместимости, в частности: классы старого стиля, целочисленное деление с обрезанием результата как поведение по умолчанию, строковые исключения, неявный относительный импорт, оператор exec и т. п.
* Реорганизация стандартной библиотеки.
* Новый синтаксис для метаклассов.
* Изменен синтаксис присваиваний. Стало возможным, например, присваивание (a, *rest, b) = range(5). С другой стороны, [[Параметр (программирование)|формальные параметры]] функций вроде def foo(a, (b, c)) более недопустимы.
== Специализированные подмножества/расширения Python ==
На основе Python было создано несколько специализированных подмножеств языка, в основном предназначенных для статической компиляции в машинный код. Некоторые из них:
RPython[http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html#restricted-python PyPy[coding-guide]] — созданная в рамках проекта [[PyPy]] сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. Код на RPython можно компилировать во множество других языков/платформ — C, JavaScript, Lisp, .NET[http://codespeak.net/pypy/dist/pypy/doc/carbonpython.html PyPy carbonpython], [[LLVM]]. На RPython написан интерпретатор PyPy.
Pyrex[http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/ Pyrex] — ограниченная реализация Python, но несколько меньше, чем RPython. Pyrex расширен возможностями статической типизации типами из языка С и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений, компилируется в код на языке С.
[[Cython]][http://www.cython.org/ Cython: C-Extensions for Python] — расширенная версия Pyrex.
Проект [[Shedskin]] — предназначен для компиляции неявно статически типизированного кода на Python в оптимизированный код на языке С++.
== Применение ==
{{main|Проект:Информационные технологии/Списки/Список программного обеспечения, написанного на языке программирования Python|l1=Использование Python}}
Python — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. На Python реализовано большое количество проектов, также он активно используется для создания прототипов будущих программ. Python используется во многих крупных компаниях.[http://www.python.org/about/success/usa Python Success Stories]
Python с пакетами [[NumPy]], [[SciPy]] и [[Matplotlib|MatPlotLib]] активно используется как универсальная среда для научных расчётов в качестве замены распространенным специализированным коммерческим пакетам [[Matlab]], [[IDL]] и др.
В профессиональных программах трехмерной графики, таких как [[Houdini (графическая программа)|Houdini]] и [[Nuke]], Python используется для расширения стандартных возможностей программ.[http://sites.google.com/site/pythonforscientists/python-vs-matlab Python vs Matlab] Python for scientists blog[http://www.astrobetter.com/wiki/tiki-index.php?page=idl_vs_python IDL vs. Python] AstroBetter Wiki
== См. также ==
* [[Сравнение командных оболочек]]
* [[Сравнение IDE#Python|Сравнение интегрированных средств разработки (IDE)]]
== Примечания ==
{{примечания|2}}
== Литература ==
{{викифицировать литературу}}
; На русском языке
* ''Коэльё Л.П., Ричерт В''. Построение систем машинного обучения на языке Python. — Перевод с английского. — М.: ДМК Пресс, 2015. — с. — ISBN 978-5-97060-330-7.
* ''Маккинли У''. Python и анализ данных. — Перевод с английского. — М.: ДМК Пресс, 2015. — 482 с. — ISBN 978-5-97060-315-4.
* ''Марк Саммерфилд''. Python на практике. — Перевод с английского. — М.: ДМК Пресс, 2014. — 338 с. — ISBN 978-5-97060-095-5.
* {{книга|автор=Марк Лутц.|заглавие=Программирование на Python|издание=4-е изд|том=II|ответственный=Пер. с англ|место={{СПб.}}|издательство=[[Символ-Плюс]]|год=2011|isbn=978-5-93286-211-7}}
* {{книга|автор=Марк Лутц.|ссылка=http://www.symbol.ru/date/841171.html|заглавие=Программирование на Python|издание=4-е изд|том=I|ответственный=Пер. с англ|место={{СПб.}}|издательство=[[Символ-Плюс]]|год=2011|страниц=992|isbn=978-5-93286-210-0}}
* ''Марк Лутц''. [http://www.symbol.ru/date/816603.html Изучаем Python, 4-е издание]. — Перевод с английского. — СПб.: [[Символ-Плюс]], 2010. — 1280 с — ISBN 978-5-93286-159-2
* ''Дэвид М. Бизли''. [http://www.symbol.ru/date/784182.html Python. Подробный справочник, 4-е издание]. — Перевод с английского. — СПб.: [[Символ-Плюс]], 2010. — 864 с — ISBN 978-5-93286-157-8
* ''Марк Саммерфилд''. [http://www.symbol.ru/date/661501.html Программирование на Python 3. Подробное руководство]. — Перевод с английского. — СПб.: [[Символ-Плюс]], 2009. — 608 с — ISBN 978-5-93286-161-5
* ''Ноа Гифт, Джереми М. Джонс''. [http://www.symbol.ru/date/634254.html Python в системном администрировании UNIX и Linux]. — Перевод с английского. — СПб.: [[Символ-Плюс]], 2009. — 512 с — ISBN 978-5-93286-149-3
* Бизли, Дэвид М. Язык программирования Python. Справочник. — К.: ДиаСофт, 2000. — 336 с. — ISBN 966-7393-54-2, ISBN 0-7357-0901-7
* Сузи Р. А. Python. Наиболее полное руководство (+CD). — СПб.: БХВ-Петербург, 2002. — 768 с. — ISBN 5-94157-097-X
* Сузи Р. А. Язык программирования Python: Учебное пособие. — М.: ИНТУИТ, БИНОМ. Лаборатория знаний, 2006. — 328 с. — ISBN 5-9556-0058-2, ISBN 5-94774-442-2
* {{Книга|автор=Доусон М.|ссылка=|заглавие=Программируем на Python|место={{СПб.}}|издательство=[[Питер (издательство)|Питер]]|год=2012|страниц=432|isbn=978-5-459-00314-7}}
* {{Книга|автор=С. Шапошникова.|ссылка=http://younglinux.info/pdf|заглавие=Основы программирования на Python. Учебник. Вводный курс|издание=версия 2|год=2011|страниц=44}}
* {{книга|автор=И. А. Хахаев.|ссылка=http://www.altlinux.org/Books:PythonSchool|заглавие=Практикум по алгоритмизации и программированию на Python. Учебник|место={{М.}}|издательство=[[ALT Linux (компания)|Альт Линукс]]|год=2010|страниц=126|серия=Библиотека ALT Linux|isbn=978-5-905167-02-7}}
* {{книга|автор=А. Н. Чаплыгин.|заглавие=Учимся программировать вместе с Питоном. Учебник|год=ревизия 226|страниц=135}}
; На английском языке
* {{книга|автор=David Beazley, Guido Van Rossum.|заглавие=Python: Essential Reference|издательство=New Riders Publishing|год=1999}}
* Martin C. Brown. Python: The Complete Reference. McGraw-Hill Professional Publishing, 2001
* Wesley J. Chun. Core Python Programming. Prentice Hall PTR, 2000
* Alan Gauld. Learn to Program Using Python: A Tutorial for Hobbyists, Self-Starters, and Those Who Want to Learn the Art of Programming. Addison-Wesley Professional, 2001
* John E. Grayson. Python and Tkinter Programming. Manning Publications Company, 1999
* Rashi Gupta. Making use of Python. Wiley, 2002
* Mark Hammond, Andy Robinson. Python Programming on Win32. O’Reilly, 2000
* Christopher A. Jones, Fred L. Drake. Python & XML. O’Reilly & Associates, 2001
* Ivan Van Laningham. Teach Yourself Python in 24 Hours. Sams, 2000
* Amos Latteier, Michel Pelletier. The Zope Book. New Riders Publishing, 2001
* Frederik Lundh. Python Standard Library. O’Reilly & Associates, 2001
* {{книга|автор=A. Sweigart.|ссылка=http://inventwithpython.com/chapters/|заглавие=Invent Your Own Computer Games with Python|год=2008—2010|страниц=436|isbn=978-0-9821060-1-3}}
* {{книга|автор=A. Sweigart.|ссылка=http://corepython.com/|заглавие=Core Python Applications Programming|год=2012|страниц=888|isbn=978-0-1326782-0-9}}
== Ссылки ==
{{Навигация
|Тема = Python
|Портал = Свободное программное обеспечение
|Викисловарь =
|Викиверситет = Категория:Python
|Викиучебник = Python
|Викицитатник =
|Викитека = Категория:Python
|Викивиды =
|Викиновости =
|Метавики =
|Проект =
}}
* [http://www.python.org/ Официальный сайт]{{ref-en}}
* [http://wiki.python.org/moin/RussianLanguage Каталог ссылок на русскоязычные материалы по Python на официальном вики-сайте.]{{ref-en}}
{{Python}}
{{Языки программирования}}
{{FOSS}}
{{Избранная статья|Компьютер}}
[[Категория:Python|*]]
[[Категория:Статьи с примерами кода Python]]
[[Категория:Языки с динамической типизацией]]
[[Категория:Языки веб-программирования]]
[[Категория:Высокоуровневые языки программирования]]