Python: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Восстановление работоспособности шаблонов {{sfn}}
Строка 89: Строка 89:
Набор операторов достаточно традиционен.
Набор операторов достаточно традиционен.


* Условный оператор <code>if</code> (если). Альтернативный блок после <code>else</code> (иначе). Если условий и альтернатив несколько, можно использовать <code>elif</code> (сокр. от else if){{Sfn|Васильев|pp=87—97}}:
* Условный оператор <code>if</code> (если). Альтернативный блок после <code>else</code> (иначе). Если условий и альтернатив несколько, можно использовать <code>elif</code> (сокр. от else if){{Sfn|Васильев|2017|pp=87—97}}:
: <source lang="python">
: <source lang="python">
if условие_1:
if условие_1:

Версия от 07:00, 31 января 2021

Python
Изображение логотипа
Класс языка объектно-ориентированный
Появился в 20 февраля 1991[1]
Автор Гвидо ван Россум[1]
Разработчик Python Software Foundation и Гвидо ван Россум[1]
Выпуск
Испытал влияние Алгол 68[3], ABC[4], Модула-3[5], Си[6], C++[5], Perl, Java[7], Лисп[8], Haskell[9], APL[10], Клу, Dylan, Icon и SML[10]
Лицензия Python Software Foundation License[1]
Сайт python.org (англ.)
ОС кроссплатформенность[11]
Логотип Викисклада Медиафайлы на Викискладе

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

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

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

Python — активно развивающийся язык программирования, новые версии с добавлением/изменением языковых свойств выходят примерно раз в два с половиной года. Язык не подвергался официальной стандартизации, роль стандарта де-факто выполняет CPython, разрабатываемый под контролем автора языка. В настоящий момент Python занимает второе место в рейтинге TIOBE с показателем 12,12 %[16]. Аналитики отмечают, что это самый высокий балл Python за все время его присутствия в рейтинге.

История

Гвидо Ван Россум

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

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

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

Дата окончания срока поддержки Python 2.7 первоначально была установлена на 2015 год, а затем перенесена на 2020 год из опасения, что большая часть существующего кода не может быть легко перенесена на Python 3[21][22]. Больше никаких исправлений безопасности или других улучшений для Python 2.7 не будет выпущено[23][24]. С окончанием срока службы Python 2.x поддерживаются только Python 3.6.x и более поздние версии[25].

Название языка

Пиктограмма для файлов .py

Название языка произошло вовсе не от названия семейства пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу 1970-х «Летающий цирк Монти Пайтона»[26]. Впрочем, всё равно название языка чаще связывают именно со змеёй, нежели с передачей — пиктограммы файлов в KDE или в Microsoft Windows и сам логотип языка изображает змеиные головы.

Концепция и философия

Python — мультипарадигмальный язык программирования. Полностью поддерживаются объектно-ориентированное и структурное программирование, а также функциональное и аспектно-ориентированное (в том числе метапрограммирование[27])[28]. Множество других методик, в том числе контрактное[29][30] и логическое программирование[31] можно реализовать с помощью расширений.

Язык использует динамическую типизацию вместе с подсчётом ссылок и циклический сборщик мусора для менеджмента памяти[32]. Также есть динамические разрешения имен (динамическое связывание), которые связывают имена методов и переменных во время выполнения программы.

Python предлагает поддержку функционального программирования в традициях Лиспа. Так, в Python есть функции filter, map и reduce; также из Лиспа были заимствованы понятия характеристик списков, ассоциативных массивов (словарей), множеств и генераторов списков[33]. Стандартная библиотека содержит два модуля (itertools и functools), реализующие инструменты, заимствованные из Haskell и Standard ML[34].

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

Философия начинается так[36]:

  • Красивое лучше, чем уродливое.
  • Явное лучше, чем неявное.
  • Простое лучше, чем сложное.
  • Сложное лучше, чем запутанное.

….

Вместо того, чтобы встроить в ядро Python всю функциональность языка, он был спроектирован таким образом, чтобы быть легко расширяемым. Это сделало язык популярным средством добавления программируемых интерфейсов к существующим приложениям. Видение Гвидо Ван Россума маленького ядра с большой стандартной библиотекой и легко расширяемым интерпретатором проистекало из негативного опыта разработки языка ABC, который придерживался противоположного подхода[37].

Python стремится к более простому, менее громоздкому синтаксису и грамматике, предоставляя разработчикам выбор в их методологии кодирования. В отличие от девиза Perl «есть несколько способов сделать это» (англ. There's more than one way to do it), Python придерживается философии «должен существовать один — и, желательно, только один — очевидный способ сделать это» (англ. There should be one — and preferably only one — obvious way to do it.)[38]. Алекс Мартелли[англ.], член Python Software Foundation, и автор книг по Python пишет, что «Описывать что-то как „умное“ не считается комплиментом в культуре Python» (англ. To describe something as 'clever' is not considered a compliment in the Python culture)[39].

Разработчики Python стремятся избежать преждевременной оптимизации и отвергают патчи к некритическим частям эталонной реализации CPython, которые могли бы предложить незначительное увеличение скорости за счёт понятности кода[40]. Однако есть способы повышения производительности. Если в программе есть узкие места, связанные с выполнением ресурсоёмких операций на центральном процессоре, но не связанные с использованием операций ввода-вывода, то повысить производительность возможно за счёт трансляции программы при помощи Cython в язык Си и последующей компиляции[41]. Требовательные к вычислительным ресурсам части программы также можно переписывать на язык Си и подключать как отдельные библиотеки.

Важная цель разработчиков Python — делать его забавным для использования. Это было отражено в названии языка, данном в честь Монти Пайтона[26]. Также это отражено в иногда игривом подходе к обучающим программам и справочным материалам, таким как примеры программ из документаций, которые используют названия spam и eggs вместо использующихся в документации множества других языков foo и bar[42][43].

Портируемость

Python портирован и работает почти на всех известных платформах — от КПК до мейнфреймов. Существуют порты под Microsoft Windows, практически под все варианты UNIX (включая FreeBSD и Linux), Plan 9, Mac OS и macOS, iPhone OS (iOS) 2.0 и выше, iPadOS, Palm OS, OS/2, Amiga, HaikuOS, AS/400, OS/390, Windows Mobile, Symbian и Android[44].

По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с версии 2.6 прекращена поддержка Windows 95, Windows 98 и Windows ME[45]. В версии 3.5 перестала поддерживаться Windows XP[46] В версии 3.9 перестала поддерживатся Windows Vista и Windows 7[47]. Однако на устаревших платформах можно использовать предыдущие версии Python — на данный момент сообщество активно поддерживает версии Python начиная от 2.3 (для них выходят исправления).

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

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

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

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

Все объекты делятся на изменяемые и неизменяемые: списки, словари и множества являются изменяемыми, а все остальные — неизменяемыми (например, при изменении строки фактически создаётся новая, а при изменении списка — только меняются ссылки в нём). Кортеж в Python является, по сути, неизменяемым списком. Во многих случаях кортежи работают быстрее списков, поэтому если вы не планируете изменять последовательность, то лучше использовать именно их. Неизменяемые объекты (и все объекты в них, если это, например, кортеж) могут быть ключами словаря (должны иметь метод hash).

Синтаксис и семантика

Язык обладает чётким и последовательным синтаксисом, продуманной модульностью и масштабируемостью, благодаря чему исходный код написанных на Python программ легко читаем. При передаче аргументов в функции Python использует вызов по соиспользованию (call-by-sharing)[49].

В 2018 году Гвидо ван Россум, создатель языка, решил ради политкорректности изменить терминологию кода, заменив в нём термины master и slave на parent и child, соответственно[50].

Операторы

Набор операторов достаточно традиционен.

  • Условный оператор if (если). Альтернативный блок после else (иначе). Если условий и альтернатив несколько, можно использовать elif (сокр. от else if)[51]:
if условие_1:
    команды_1
elif условие_2:
    команды_2
elif условие_3:
    команды_3
...
elif условие_N:
    команды_N
else:
    команды
  • Оператор цикла while[52]:
while условие:
    команды
  • Оператор цикла for[53]:
for элемент in последовательность:
    команды
  • Операторы обработки исключений try — except — else — finally[54]:
try:
    # основной код
except Тип_ошибки_1:
    # вспомогательный код
except Тип_ошибки_2:
    # вспомогательный код
...
except Тип_ошибки_N:
    # вспомогательный код
else:
    # код для случая, когда ошибки не было
finally:
    # код, который выполняется всегда
  • Оператор определения класса class.
  • Оператор определения функции, метода или генератора def. Внутри возможно применение return (возврат) для возврата из функции или метода, а в случае генератора — yield (давать).
  • Оператор pass ничего не делает. Используется для пустых блоков кода.

Одной из интересных синтаксических особенностей языка является выделение блоков кода с помощью отступов (пробелов или табуляций), поэтому в Python отсутствуют операторные скобки begin/end, как в языке Паскаль, или фигурные скобки, как в Си. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Некоторым[кому?] такое поведение может показаться неинтуитивным и неудобным.

Выражения

Выражение является полноправным оператором в Python. Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок.

Отдельно стоит упомянуть операцию форматирования для строк (работает по аналогии с функцией printf() из Си), которая использует тот же символ, что и взятие остатка от деления:

>>> str_var = "world"
>>> print("Hello, %s" % str_var)
Hello, world

В версии 3.6 были добавлены форматированные строковые литералы, или f-строки, которые делают код более читаемым и лаконичным:

>>> str_var = "world"
>>> print(f"Hello, {str_var}") # вывод с использованием f-строки
Hello, world

Python имеет удобные цепочечные сравнения. Такие условия в программах — не редкость:

1 <= a < 10 and 1 <= b < 20

Кроме того, логические операции (or и and) являются ленивыми: если для вычисления значения операции достаточно первого операнда, этот операнд и является результатом, в противном случае вычисляется второй операнд логической операции. Это основывается на свойствах алгебры логики: например, если один аргумент операции «ИЛИ» (or) является истиной, то и результат этой операции всегда является истиной. В случае, если второй операнд является сложным выражением, это позволяет сократить издержки на его вычисление. Этот факт широко использовался до версии 2.5 вместо условной конструкции:

a < b and "меньше" or "больше или равно"

Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант):

"строка и Юникод-строка одновременно"
'строка и Юникод-строка одновременно'
"""тоже строка и Юникод-строка одновременно"""
True or False  # булевы литералы
3.14  # число с плавающей запятой
0b1010 + 0o12 + 0xA  # числа в двоичной, восьмеричной и шестнадцатеричной системах счисления
1 + 2j  # комплексное число
[1, 2, "a"]  # список
(1, 2, "a")  # кортеж
{'a': 1, 'b': 'B'}  # словарь
{'a', 6, 8.8}  # множество
lambda x: x**2  # анонимная функция
(i for i in range(10)) # генератор

Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза s[N:M] означает, что в срез попадают все элементы от N включительно до M, не включая. В качестве иллюстрации можно посмотреть пример работы с последовательностями. При этом индекс можно не указывать. Например, запись s[:M] означает, что в срез попадают все элементы с самого начала; запись s[N:] означает, что попадают все элементы до конца среза; запись s[:] означает, что попадают все элементы с начала и до конца.

Имена

Имя (идентификатор) может начинаться с латинской буквы (в Python 3 — буквы любого алфавита в Юникоде, например кириллицы) любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по import keyword; print(keyword.kwlist)) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение[55].

В каждой точке программы интерпретатор имеет доступ к трём пространствам имён (то есть отображениям имён в объекты): локальному, глобальному и встроенному.

Области видимости имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.

Строки документации

Python предлагает механизм документирования кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — docstring[англ.]. Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации[56](переменная __doc__), что используется современными IDE (Интегрированная среда разработки) (например, Eclipse).

В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить doctest[англ.] для автоматического тестирования модуля.

Директивы

Начиная с Python 2.3, для использования в тексте программы символов, не входящих в ASCII, необходимо явно указывать кодировку исходного кода в начале модуля, например:

# -*- coding: utf-8 -*-
# или
# coding: utf-8

После этого можно использовать, например, кириллицу в Unicode-литералах. Но на самом деле даже если написать:

# coding: utf

то Python «поймёт», что вы хотели сделать.

Возможности

Объектно-ориентированное программирование

Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Python является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками.

Возможности и особенности.

  • Классы являются одновременно объектами со всеми ниже приведёнными возможностями.
  • Наследование, в том числе множественное.
  • Полиморфизм (все функции виртуальные), Дженерики[57].
  • Инкапсуляция (два уровня — общедоступные и скрытые методы и поля). Особенность — скрытые члены доступны для использования и помечены как скрытые лишь особыми именами.
  • Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.
  • Перегрузка операторов (всех, кроме is, '.', '=' и символьных логических).
  • Свойства (имитация поля с помощью функций).
  • Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).
  • Методы для управления наиболее распространёнными операциями (истинностное значение, len(), глубокое копирование, сериализация, итерация по объекту, …)
  • Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.)
  • Полная интроспекция.
  • Классовые и статические методы, классовые поля.
  • Классы, вложенные в функции и классы.

Обобщенное программирование

Python поддерживает парадигму обобщенного программирования, в частности:

Функциональное программирование

Python поддерживает парадигму функционального программирования, в частности:

  • функция является объектом;
  • функции высших порядков;
  • рекурсия;
  • развитая обработка списков (списочные сокращения, операции над последовательностями, итераторы);
  • аналог замыканий;
  • частичное применение функции;
  • возможность реализации других средств на самом языке (например, карринг).

Модули и пакеты

Программное обеспечение (приложение или библиотека) на Python оформляется в виде модулей, которые в свою очередь могут быть собраны в пакеты. Модули могут располагаться как в каталогах, так и в ZIP-архивах. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Python, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором import. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией reload().

Интроспекция

Python поддерживает полную интроспекцию времени исполнения. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.

Применение интроспекции является важной частью того, что называют pythonic style, и широко применяется в библиотеках и фреймворках Python, таких как PyRO, PLY, Cherry, Django и др., значительно экономя время использующего их программиста.


Обработка исключений

Обработка исключений поддерживается в Python посредством операторов try, except, else, finally, raise, образующих блок обработки исключения. В общем случае блок выглядит следующим образом:

try:
    # Здесь код, который может вызвать исключение
    raise Exception("message")  # Exception, это один из стандартных типов исключения (всего лишь класс),
                                # может использоваться любой другой, в том числе свой
except (Тип исключения1, Тип исключения2, ) as Переменная:
    # Код в блоке выполняется, если тип исключения совпадает с одним из типов
    # (Тип исключения1, Тип исключения2, …) или является наследником одного
    # из этих типов.
    # Полученное исключение доступно в необязательной Переменной.
except (Тип исключения3, Тип исключения4, ) as Переменная:
    # Количество блоков except не ограничено
    raise  # Сгенерировать исключение "поверх" полученного; без параметров - повторно сгенерировать полученное
except:
    # Будет выполнено при любом исключении, не обработанном типизированными блоками except
else:
    # Код блока выполняется, если не было поймано исключений.
finally:
    # Будет исполнено в любом случае, возможно после соответствующего
    # блока except или else

Совместное использование else, except и finally стало возможно только начиная с Python 2.5. Информация о текущем исключении всегда доступна через sys.exc_info(). Кроме значения исключения, Python также сохраняет состояние стека вплоть до точки возбуждения исключения — так называемый traceback.

В отличие от компилируемых языков программирования, в Python использование исключения не приводит к значительным накладным расходам (а зачастую даже позволяет ускорить исполнение программ) и очень широко используется. Исключения согласуются с философией Python (10-й пункт «дзена Python» — «Ошибки никогда не должны умалчиваться») и являются одним из средств поддержки «утиной типизации».

Иногда вместо явной обработки исключений удобнее использовать блок with (доступен, начиная с Python 2.5).

Итераторы

В программах на Python широко используются итераторы. Цикл for может работать как с последовательностью, так и с итератором. Большинство коллекций предоставляют итераторы, итераторы могут также определяться пользователем для собственных объектов. Модуль itertools стандартной библиотеки содержит средства работы с итераторами.

Генераторы

Одной из интересных возможностей языка являются генераторы — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию (см. также: сопрограммы). Генераторы могут использоваться как итераторы для структур данных и для ленивых вычислений. См. пример: генератор чисел Фибоначчи.

При вызове генератора функция немедленно возвращает объект-итератор, который хранит текущую точку исполнения и состояние локальных переменных функции. При запросе следующего значения (посредством метода next(), неявно вызываемого в цикле for) генератор продолжает исполнение функции от предыдущей точки остановки до следующего оператора yield или return.

В Python 2.4 появились генераторные выражения — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами:

>>> sum(i for i in range(1, 100) if i % 2 != 0)
2500

В этом примере суммируются все нечётные числа от 1 до 99.

Начиная с версии 2.5, Python поддерживает полноценные сопроцедуры: теперь в генератор можно передавать значения с помощью метода send() и возбуждать в его контексте исключения с помощью метода throw().

Также Python поддерживает вложенные генераторы. Например, для создания двумерного массива нужно разместить генератор списка, являющегося строкой, внутри генератора всех строк: [[0 for j in range(m)] for i in range(n)]

Управление контекстом выполнения

В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор with и модуль contextlib. См.: пример.

Оператор может применяться в тех случаях, когда до и после некоторых действий должны обязательно выполняться некоторые другие действия, независимо от возбуждённых в блоке исключений или операторов return: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки.

Декораторы

Начиная с версии 2.4, Python позволяет использовать так называемые декораторы[59][60] (не следует путать с одноимённым шаблоном проектирования) для поддержки существующей практики преобразования функций и методов в месте определения (декораторов может быть несколько). Для декораторов используется символ @ в строках, предшествующих определению функции или метода. Синтаксис декорирования является синтаксическим сахаром[61][62] для удобочитаемости: код

@staticmethod
def my_wonderful_method():
    return "Некоторый метод"

полностью эквивалентен

def my_wonderful_method():
    return "Некоторый метод"
my_wonderful_method = staticmethod(my_wonderful_method)

Сам декоратор является функцией, получающей в качестве первого аргумента декорируемую функцию. Для передачи дополнительных аргументов можно использовать синтаксис @декоратор(аргументы). Декораторы можно считать элементом аспектно-ориентированного программирования.

С версии 2.6 декораторы можно использовать с классами аналогично функциям.

Регулярные выражения

Формат регулярных выражений унаследован из Perl с некоторыми отличиями. Для их использования требуется импортировать модуль re[63], являющийся частью стандартной библиотеки.

Другие возможности

В Python есть ещё несколько возможностей, отличающих его от многих других языков высокой гибкостью и динамичностью.

Например, класс является объектом, а в операторе определения класса в списке родительских классов можно использовать выражения.

def get_class():
    return dict

class D(get_class()):
    pass

d = D()

Можно модифицировать многие объекты во время исполнения, например классы:

>>> class X(object): pass

>>> y = X()
>>> y.wrong_method()  # такого метода пока нет
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'X' object has no attribute 'wrong_method'
>>> X.wrong_method = lambda self : 'im here' # добавим его
>>> y.wrong_method() # так как доступ к методу приводит к поиску по __dict__ класса,
'im here' # то wrong_method становится доступным всем экземплярам

Библиотеки

Стандартная библиотека

Python поставляется «с батарейками в комплекте».

Богатая стандартная библиотека является одной из привлекательных сторон Python. Здесь имеются средства для работы со многими сетевыми протоколами и форматами Интернета, например, модули для написания HTTP-серверов и клиентов, для разбора и создания почтовых сообщений, для работы с XML и т. п. Набор модулей для работы с операционной системой позволяет писать кросс-платформенные приложения. Существуют модули для работы с регулярными выражениями, текстовыми кодировками, мультимедийными форматами, криптографическими протоколами, архивами, сериализации данных, поддержка юнит-тестирования и др.

Модули расширения и программные интерфейсы

Помимо стандартной библиотеки существует множество библиотек, предоставляющих интерфейс ко всем системным вызовам на разных платформах; в частности, на платформе Win32 поддерживаются все вызовы Win32 API, а также COM в объёме не меньшем, чем у Visual Basic или Delphi. Количество прикладных библиотек для Python в самых разных областях без преувеличения огромно (веб, базы данных, обработка изображений, обработка текста, численные методы, приложения операционной системы и т. д.).

Для Python принята спецификация программного интерфейса к базам данных DB-API 2 и разработаны соответствующие этой спецификации пакеты для доступа к различным СУБД: Oracle, MySQL, PostgreSQL, Sybase, Firebird (Interbase), Informix, Microsoft SQL Server и SQLite. На платформе Windows доступ к БД возможен через ADO (ADOdb). Коммерческий пакет mxODBC для доступа к СУБД через ODBC для платформ Windows и UNIX разработан eGenix[64]. Для Python написано много ORM (SQLObject, SQLAlchemy, Dejavu, Django), выполнены программные каркасы для разработки веб-приложений (Django, Pylons, Pyramid).

Библиотека NumPy для работы с многомерными массивами позволяет иногда достичь производительности научных расчётов, сравнимой со специализированными пакетами. SciPy использует NumPy и предоставляет доступ к обширному спектру математических алгоритмов (матричная алгебра — BLAS уровней 1—3, LAPACK, БПФ…). Numarray[65] специально разработан для операций с большими объёмами научных данных.

WSGI[66] — интерфейс шлюза с веб-сервером (Python Web Server Gateway Interface).

Python предоставляет простой и удобный программный интерфейс C API для написания собственных модулей на языках Си и C++. Такой инструмент как SWIG позволяет почти автоматически получать привязки для использования C/C++ библиотек в коде на Python. Возможности этого и других инструментов варьируются от автоматической генерации (C/C++/Fortran)-Python интерфейсов по специальным файлам (SWIG, pyste[67], SIP[68], pyfort[69]), до предоставления более удобных API (boost::python[70][71], CXX[72], Pyhrol[73] и др.). Инструмент стандартной библиотеки ctypes позволяет программам Python напрямую обращаться к динамическим библиотекам/DLL, написанным на Си. Существуют модули, позволяющие встраивать код на С/C++ прямо в исходные файлы Python, создавая расширения «на лету» (pyinline[74], weave[75]).

Другой подход состоит во встраивании интерпретатора Python в приложения. Python легко встраивается в программы на Java, C/C++, OCaml. Взаимодействие Python-приложений с другими системами возможно также с помощью CORBA, XML-RPC, SOAP, COM.

С помощью проекта Cython возможна трансляция программ, написанных на языках Python и Pyrex, в код на языке Си с последующей компиляцией в машинный код. Cython используется для упрощения написания Python-библиотек, при его использовании отмечается ускорение кода и уменьшение накладных расходов.

Экспериментальный проект Shedskin предполагает создание компилятора для трансформации неявно типизированных Python-программ в оптимизированный С++ код. Начиная с версии 0.22 Shedskin позволяет компилировать отдельные функции в модули расширений.

Python и подавляющее большинство библиотек к нему бесплатны и поставляются в исходных кодах. Более того, в отличие от многих открытых систем, лицензия никак не ограничивает использование Python в коммерческих разработках и не налагает никаких обязательств, кроме указания авторских прав.

Одним из каналов распространения и обновления пакетов для Python является PyPI (англ. Python Package Index).

Графические библиотеки

С Python поставляется библиотека tkinter на основе Tcl/Tk для создания кросс-платформенных программ с графическим интерфейсом.

Существуют расширения, позволяющие использовать все основные библиотеки графических интерфейсов — wxPython[76], основанное на библиотеке wxWidgets, PyGObject для GTK[77], PyQt и PySide для Qt и другие. Некоторые из них также предоставляют широкие возможности по работе с базами данных, графикой и сетями, используя все возможности библиотеки, на которой основаны.

Для создания игр и приложений, требующих нестандартного интерфейса, можно использовать библиотеку Pygame. Она также предоставляет обширные средства работы с мультимедиа: с её помощью можно управлять звуком и изображениями, воспроизводить видео. Предоставляемое pygame аппаратное ускорение графики OpenGL имеет более высокоуровневый интерфейс по сравнению с PyOpenGL[78], копирующей семантику С-библиотеки для OpenGL. Есть также PyOgre[79], обеспечивающая привязку к Ogre — высокоуровневой объектно-ориентированной библиотеке 3D-графики. Кроме того, существует библиотека pythonOCC[80], обеспечивающая привязку к среде 3D-моделирования и симуляции OpenCascade[81].

Для работы с растровой графикой используется библиотека Python Imaging Library.

Для работы с векторной графикой используется PyCairo.

Контроль типов и перегрузка функций

Существуют модули, позволяющие контролировать типы параметров функций на этапе исполнения, например, typecheck[82] или method signature checking decorators[83]. Необязательная декларация типов для параметров функции добавлена в Python 3, интерпретатор при этом не проверяет типы, а только добавляет соответствующую информацию к метаданным функции для последующего использования этой информации модулями расширений[84].

Перегрузка функций реализована различными сторонними библиотеками, в том числе PEAK[85][86]. Планы, которые не были приняты, по поддержке перегрузки в Python3000[87] были частично реализованы в библиотеке overloading-lib[88].

Примеры программ

В статье «Примеры программ на языке Python» собраны примеры небольших программ, демонстрирующих некоторые возможности языка Python и его стандартной библиотеки.

Программа «Hello World!» может быть написана одной строкой:

print("Hello World!")

Вычисление факториала числа 10 (10!):

def factorial(n):
    if n < 0:
        raise ArithmeticError('Факториал отрицательного числа.')
    f = 1
    for i in range (2, n + 1):
        f *= i
    return f

print(factorial(10)) # 3628800

Реализация с помощью рекурсии:

def factorial(n):
    if n < 0:
        raise ArithmeticError('Факториал отрицательного числа.')
    if (n == 0) or (n == 1):
        return 1
    else:
        return factorial(n - 1) * n

print(factorial(10))

Профилирование и оптимизация кода

В стандартной библиотеке Python имеется профайлер (модуль profile), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модуль timeit. Производимые в следующей программе измерения позволяют выяснить, какой из вариантов конкатенации строк более эффективен:

from timeit import Timer

tmp = "Python 3.2.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32."

def case1(): # А. инкрементальные конкатенации в цикле
    s = ""
    for i in range(10000):
        s += tmp

def case2(): # Б. через промежуточный список и метод join
    s = []
    for i in range(10000):
        s.append(tmp)
    s = "".join(s)

def case3(): # В. списковое выражение и метод join
    return "".join([tmp for i in range(10000)])

def case4(): # Г. генераторное выражение и метод join
    return "".join(tmp for i in range(10000))

for v in range(1,5):
    print (Timer("func()","from __main__ import case%s as func" % v).timeit(200))

Как и в любом языке программирования, в Python имеются свои приёмы оптимизации кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг с другом) критериев (увеличение быстродействия, уменьшение объёма требуемой оперативной памяти, компактность исходного кода и т. д.). Чаще всего программы оптимизируют по времени исполнения.

Здесь есть несколько очевидных правил.

  • Не нужно оптимизировать программу, если скорость её выполнения достаточна.
  • Используемый алгоритм имеет определённую временную сложность, поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм.
  • Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Python есть встроенная функция sorted().
  • Профилирование поможет выяснить узкие места. Оптимизацию нужно начинать с них.

Python имеет следующие особенности и связанные с ними правила оптимизации.

  • Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обработка той же последовательности в цикле вызовом функции.
  • Старайтесь вынести из глубоко вложенного цикла всё, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным или чем доступ к полям.
  • Оптимизатор psyco может помочь ускорить работу модуля программы при условии, что модуль не использует динамических свойств языка Python.
  • В случае, если модуль проводит массированную обработку данных и оптимизация алгоритма и кода не помогает, можно переписать критические участки, скажем, на языке Си или Pyrex.

Инструмент под названием Pychecker[89] поможет проанализировать исходный код на Python и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint[90] призван решать близкие задачи, но имеет уклон в сторону проверки стиля кода, поиска кода с запашком[91].

Сравнение с другими языками

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

  • ABC — отступы для группировки операторов, высокоуровневые структуры данных (map)[92][93] (Python фактически создавался как попытка исправить ошибки, допущенные при проектировании ABC);
  • Modula-3 — пакеты, модули, использование else совместно с try и except, именованные аргументы функций (на это также повлиял Common Lisp);
  • C, C++ — некоторые синтаксические конструкции (как пишет сам Гвидо ван Россум — он использовал наиболее непротиворечивые конструкции из C, чтобы не вызвать неприязнь у C-программистов к Python[92]);
  • Smalltalk — объектно-ориентированное программирование;
  • Lisp, в частности, Scheme — отдельные черты функционального программирования (lambda, map, reduce, filter и другие);
  • Fortran — срезы массивов, комплексная арифметика;
  • Miranda — списочные выражения;
  • Java — модули logging, unittest, threading (часть возможностей оригинального модуля не реализована), xml.sax стандартной библиотеки, совместное использование finally и except при обработке исключений, использование @ для декораторов;
  • Icon — генераторы.

Большая часть других возможностей Python (например, байт-компиляция исходного кода) также была реализована ранее в других языках.

Наиболее часто Python сравнивают с Perl и Ruby. Эти языки также являются интерпретируемыми и обладают примерно одинаковой скоростью выполнения программ. Как и Perl, Python может успешно применяться для написания скриптов (сценариев).

Как и Ruby, Python является хорошо продуманной системой для ООП. При этом реализация ООП в Python отличается от многих других объектно-ориентированных языков. В частности:

  • В отличие от Ruby, Python не придерживается идеологии «всё — объект», и поддерживает встроенные примитивные типы, не входящие в иерархию классов. Такое решение упрощает и делает более технически эффективным межъязыковое взаимодействие, хотя может быть сочтено неудобным фанатами объектного подхода.
  • В отличие от некоторых ООЯП (Java, Object Pascal, Ruby, …) в Python нет реального общего базового класса, от которого все объекты наследуют общие методы. Хотя формально новый класс в Python наследует (прямо или косвенно) тип object, это является только синтаксическим приёмом, так как методы, которые являются общими для всех объектов — id, type, isinstance, issubclass, str, repr, getattr, … не наследуются от object, а реализованы в виде глобальных функций. Такое решение приводит к тому, что изменение поведения этих методов производится не перегрузкой, а определением специальных методов класса.

В среде коммерческих приложений скорость выполнения программ на Python часто сравнивают с Java-приложениями[94].

Недостатки

Синтаксис и семантика

Несмотря на то, что одним из заявленных принципов дизайна Python является принцип наименьшего удивления, критики отмечают целый ряд архитектурных решений, которые могут вводить в заблуждение или вызывать недоумение у программистов, привыкших к другим распространённым языкам[95]. В их числе:

  • Отличие в принципе работы оператора присвоения по сравнению со статически-типизированными языками. В Python при присвоении значения копируется ссылка на объект, а не значение. При работе с простыми неизменяемыми типами возникает ощущение изменения значения переменной при присваивании ей значения, однако фактически присваивается ссылка на другое значение, например, при увеличении значения переменной типа int на 1 меняется ссылка, а не увеличивается значение по ссылке. Однако при работе с изменяемыми типами их содержимое можно менять по ссылке, поэтому при присвоении одной переменной ссылки на другую и последующем изменении значения в одной из двух переменных оно изменится в обоих переменных, что хорошо заметно при работе со списками[95][96]. При этом кортежи хоть и являются неизменяемыми, но могут хранить ссылки из изменяемые объекты, поэтому по факту кортежи тоже можно менять[97].
  • Отличие в поведении на некоторых типах «сокращённых» операторов, таких как += и их развёрнутой записи, хотя в большинстве языков «сокращённый» вариант — это просто краткая запись полного, и семантически они абсолютно эквивалентны.
  • Жёсткая трактовка лексической области видимости, подобная используемой в JavaScript: даже если переменная получает значение в последней строке функции, её областью видимости является вся функция.
  • Путаница между полями класса и полями объекта.
  • Интуитивно трудно предсказуемое поведение параметров со значением-объектом по умолчанию. Если в качестве инициализатора для параметра по умолчанию указать конструктор объекта, это приведёт к созданию статического объекта, ссылка на который и будет передаваться по умолчанию в каждый вызов[98]. Это может повлечь трудно уловимые ошибки.

Низкое быстродействие

Классический Python имеет общий со многими другими интерпретируемыми языками недостаток — сравнительно невысокую скорость выполнения программ[99]. В некоторой степени ситуацию улучшает сохранение байт-кода (расширения .pyc и, до версии 3.5, .pyo), которое позволяет интерпретатору не тратить время на синтаксический разбор текста модулей при каждом запуске.

Существуют реализации языка Python, вводящие высокопроизводительные виртуальные машины (ВМ) в качестве бэкенда компилятора. Примерами таких реализаций может служить PyPy, базирующийся на RPython; более ранней инициативой является проект Parrot. Ожидается, что использование ВМ типа LLVM приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где низкая вычислительная производительность в основном преодолена[100]. Однако нельзя забывать, что динамический характер Python делает неизбежными дополнительные накладные расходы при исполнении программ, что ограничивает производительность Python-систем независимо от применяемых технологий. Вследствие этого для написания критических участков кода используются низкоуровневые языки, интеграция с которыми обеспечивается множеством программ и библиотек (см. выше).

В самой популярной реализации языка Python интерпретатор довольно велик и более требователен к ресурсам, чем в аналогичных популярных реализациях Tcl, Forth, LISP или Lua, что ограничивает его применение во встроенных системах. Тем не менее, Python нашёл применение в КПК и некоторых моделях мобильных телефонов[101].

Невозможность модификации встроенных классов

По сравнению с Ruby и некоторыми другими языками, в Python отсутствует возможность модифицировать встроенные классы, такие, как int, str, float, list и другие, что, однако, позволяет Python потреблять меньше оперативной памяти и быстрее работать. Ещё одной причиной введения такого ограничения является необходимость согласования с модулями расширения. Многие модули (в целях оптимизации быстродействия) преобразуют Python-объекты элементарных типов к соответствующим Си-типам вместо манипуляций с ними посредством Си-API. Также это избавляет от многих потенциальных ошибок при неконтролируемом динамическом переопределении встроенных типов.

Глобальная блокировка интерпретатора (GIL)

Интерпретатор Python в CPython, Stackless и PyPy использует потоко-небезопасные данные, во избежание разрушения которых при совместной модификации из разных потоков применяется глобальная блокировка интерпретатора — GIL (Global Interpreter Lock): в ходе исполнения кода поток интерпретатора блокирует GIL, выполняет некоторое количество инструкций (по умолчанию 100), после чего освобождает блокировку и приостанавливается, давая возможность работать другим потокам. GIL также освобождается во время ввода-вывода, изменения и проверки состояния синхронизирующих примитивов, при исполнении кода расширений, не обращающихся к данным интерпретатора, например, NumPy/SciPy. Таким образом, в каждый момент времени в одном процессе интерпретатора Python может исполняться только один поток кода на Python, независимо от числа доступных процессорных ядер.

Потери производительности от GIL зависят от характера программ и архитектуры системы. Большинство программ является однопоточными, либо запускает всего несколько потоков, из которых часть в каждый конкретный момент простаивает в ожидании. Персональные компьютеры обычно имеют небольшое количество процессорных ядер, которые загружены параллельно исполняющимися в системе процессами, так что реальные потери производительности на персональных компьютерах из-за GIL невелики. Но в серверных приложениях может быть удобно использовать десятки и сотни (а то и больше) параллельных потоков (например, в системах массового обслуживания, где каждый поток обрабатывает данные для отдельного пользовательского запроса), а серверы на конец 2010-х годов нередко имеют десятки и даже сотни процессорных ядер, то есть технически могут обеспечить этим потокам физически одновременное исполнение; в таких условиях GIL может приводить к действительно значительному снижению общей производительности, так как лишает программу возможности полноценно использовать ресурсы многоядерных систем.

Ведётся работа по оптимизации GIL[102][103]. Отказ от GIL в ближайшем будущем не планируется, так как альтернативные механизмы на однопоточных приложениях, которых большинство, работают медленнее или потребляют больше ресурсов:

  • Вариант интерпретатора с синхронизацией доступа к отдельным объектам вместо глобальной блокировки[104] из-за частых захватов/освобождений блокировок оказался слишком медленным.
  • python-safethread — CPython без GIL[105], по утверждениям авторов, обеспечивает на однопоточных приложениях скорость порядка 60-65 % от скорости CPython.
  • Реализация потоков через процессы ОС, например, модуль processing[106] (с версии 2.6 переименован в multiprocessing). В UNIX-подобных системах накладные расходы при порождении процесса невелики, но в Windows использование процессов вместо потоков ведёт к существенному увеличению расхода оперативной памяти.
  • Отказ от совместного использования изменяемых данных и вызовов внешнего кода. При этом данные дублируются в потоках и их синхронизация (если таковая нужна) лежит на программисте[107]. Этот подход также увеличивает потребление оперативной памяти, хотя и не настолько сильно, как при использовании процессов в Windows.
  • Библиотеки, обеспечивающие собственную организацию поддержки потоков, такие как parallelpython[108], pympi[109] и другие.

Радикальным вариантом решения проблемы может быть переход на Jython и IronPython, работающие на виртуальных машинах Java и .NET/Мono: эти реализации вообще не используют GIL.

Реализации

CPython является основной, но не единственной реализацией языка программирования Python. Существуют также другие реализации.

  • PyPy — реализация Python, написанная на RPython (подмножество Python, имеющее намного меньше динамических возможностей). Позволяет легко проверять новые возможности. В PyPy, кроме стандартного CPython, включены возможности Stackless, Psyco, модификация AST «на лету» и многое другое. В проект интегрированы возможности анализа Python-кода и трансляция в другие языки и байткоды виртуальных машин (Си, LLVM, Javascript, .NET с версии 0.9.9). Начиная с 0.9.0, возможна полностью автоматическая трансляция RPython в Си, в результате чего достигается скорость, приемлемая для использования (в 2—3 раза ниже, чем CPython при отключённом JIT для версии 0.9.9). По умолчанию PyPy поставляется со встроенным JIT-компилятором, с помощью которого он способен работать намного быстрее, чем CPython.
  • Numba[англ.] — Jit-компилятор на основе LLVM с поддержкой NumPy.
  • PyS60[101] — реализация языка для смартфонов фирмы Nokia на платформе Series 60.
  • IronPython — Python для .NET Framework и Mono. Компилирует Python программы в MSIL, таким образом предоставляя полную интеграцию с .NET-системой[110].
  • Stackless — также написанная на Си реализация Python. Это не полноценная реализация, а патчи к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину рекурсии.
  • Python for .NET[111] — ещё одна реализация Python для .NET. В отличие от IronPython эта реализация не компилирует Python код в MSIL, а только предоставляет интерпретатор, написанный на C#. Позволяет использовать .NET-сборки из Python кода.
  • Jython — реализация Python, использующая JVM в качестве среды исполнения. Позволяет прозрачно использовать Java-библиотеки[112].
  • python-safethread[105] — версия CPython без GIL, что позволяет одновременно исполнять Python потоки на всех доступных процессорах. Внесены также некоторые другие изменения.
  • Unladen Swallow — начатый Google проект по разработке высокоэффективного, максимально совместимого с CPython JIT-компилятора на базе LLVM. Согласно планам по развитию Python[113], планировалось перенести исходный код Unladen Swallow в CPython в версии 3.3. Но PEP-3146 был отменён в связи с отсутствием интереса к Unladen Swallow со стороны Google, основного спонсора разработки[114].
  • tinypy[115] — минималистическая версия Python. Часть возможностей CPython не реализована.
  • MicroPython — реализация Python 3 для встроенных систем с малым объёмом оперативной памяти[116].
  • Brython[117] — реализация языка на клиентском JavaScript, позволяющая писать браузерные скрипты на Python 3.
  • QPython[118] — реализация python для Android. Проект всё ещё на стадии тестирования, однако на qpython уже портированы некоторые самые необходимые библиотеки. Позволяет и работать в интерактивном режиме. Существует также Qpython3.

Дальнейшая разработка

Python Enhancement Proposal («PEP») — это документ со стандартизированным дизайном, предоставляющий общую информацию о языке Python, включая новые предложения, описания и разъяснения возможностей языка. PEP предлагаются как основной источник для предложения новых возможностей и для разъяснения выбора того или иного дизайна для всех основных элементов языка. Выдающиеся PEP рецензируются и комментируются Гвидо ван Россумом, имеющим в проекте статус «великодушного пожизненного диктатора». 12 июля 2018 года Гвидо ван Россум отправил себя в бессрочный отпуск с должности «великодушного пожизненного диктатора»[119][120].

График и совместимость

Серии 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[121][122][123][124]:

  • Синтаксическая возможность для аннотации параметров и результата функций (например, для передачи информации о типе или документирования).
  • Полный переход на unicode для строк.
  • Введение нового типа «неизменяемые байты» и типа «изменяемый буфер». Оба необходимы для представления бинарных данных.
  • Новая подсистема ввода-вывода (модуль io), имеющая отдельные представления для бинарных и текстовых данных.
  • Абстрактные классы, абстрактные методы (доступно уже в 2.6).
  • Иерархия типов для чисел.
  • Выражения для словарей и множеств {k: v for k, v in a_dict} и {el1, el2, el3} (по аналогии со списковыми выражениями). Эта возможность была также добавлена в Python 2.7
  • Изменения print из встроенного выражения во встроенную функцию. Это позволит модулям делать изменения, подстраиваясь под разное использование функции, а также упростит код. В Python 2.7 эта возможность активируется вводом 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[125] — созданная в рамках проекта PyPy сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. Код на RPython можно компилировать во множество других языков/платформ — C, JavaScript, Lisp, .NET[126], LLVM. На RPython написан интерпретатор PyPy.
  • Pyrex[127] — ограниченная реализация Python, но несколько меньше, чем RPython. Pyrex расширен возможностями статической типизации типами из языка C и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений, компилируется в код на языке C.
  • Cython[128] — расширенная версия Pyrex.
  • Проект Shedskin — предназначен для компиляции неявно статически типизированного кода на Python в оптимизированный код на языке C++.
IDLE

Инструменты поддержки программирования

Интерактивный режим

Подобно Лиспу и Прологу, Python может использоваться в интерактивном режиме, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран (REPL). Этот режим удобен как при изучении языка, так и в процессе профессиональной разработки — для быстрого тестирования отдельных фрагментов кода, — так как обеспечивает немедленную обратную связь. Также он позволяет использовать интерпретатор в качестве калькулятора с большим набором функций.

  • Эталонная реализация Python имеет встроенный интерактивный интерпретатор, работающий в режиме текстового терминала и позволяющий выполнять все основные операции. В интерактивном режиме доступен отладчик pdb и система помощи (вызывается по help()), работающая для всех модулей, классов и функций, которые содержат строки документации.
>>> 2 ** 100 # возведение 2 в степень 100
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
  • IPython[129] — выходящая под BSD-лицензией кросс-платформенная интерактивная оболочка, предоставляющая расширенную интроспекцию и дополнительные команды. В частности, позволяет передавать исполняемому коду на Python результаты выполнения команд системной командной оболочки. Поддерживает подсветку кода и автоматическое дополнение.
  • bpython[130] — расширение стандартной командной оболочки Python с помощью ряда дополнительных модулей. Реализует подсветку синтаксиса, автоматическое дополнение кода с предложением вариантов, автоматическое выравнивание, интеграция с Pastebin, сохранение ввода в файл, восстановление удалённой строки, предложение параметров для функций.

Почти все IDE для Python поддерживают REPL для быстрого тестирования.

IDE

Существует несколько специализированных IDE для разработки на Python.

  • Eric — полнофункциональный редактор Python и IDE, написанный на Python. Он базируется на кросс-платформенном фреймворке Qt, в качестве компонента редактирования используется QScintilla. Eric предоставляет возможности ведения проектов, отладки, профилирования, рефакторинга кода, взаимодействия с популярными системами управления версиями, такими как Subversion и Git. Расширяется через механизм плагинов. Репозиторий плагинов доступен прямо из среды разработки. Распространяется бесплатно, лицензия GNU GPL v3.
  • PyCharm — полнофункциональная IDE для Python от JetBrains, доступна на платформах Windows, macOS и Linux, существует в бесплатном (Community) и платном (Professional) вариантах.
  • Wing IDE[англ.] — линейка Python-IDE от американской фирмы Wingware, включает три варианта: «Wing 101», «Wing Personal», «Wing Pro», из которых первые два бесплатны, последний — платный. Версия Pro обладает всеми необходимыми средствами для профессиональной разработки, включая поддержку проектов, работу с системами управления версиями, расширенные возможности навигации по коду и анализа кода, рефакторинг, поддержка использования Django. Бесплатные версии предоставляют меньше функций и не выходят за пределы возможностей, доступных в других бесплатных IDE для Python.
  • Spyder — open-source IDE для Python под лицензией MIT, бесплатная, доступна на платформах Windows, Mac OS X и Linux. Особенностью является то, что IDE ориентирована на data science, в ней удобно работать с библиотеками типа SciPy, NumPy, Matplotlib. Spyder поставляется в комплекте с менеджером пакетов Anaconda. В целом обладает качествами стандартной IDE, имеет редактор с подсветкой синтаксиса, автоматическое дополнение кода, обозреватель документации.
  • Thonny — многоплатформенная бесплатная IDE, выпускается под лицензией MIT, поддерживается Институтом информатики Тартуского университета в Эстонии. Позиционируется как «Python IDE для новичков», полностью, включая интерпретатор Python, ставится «из коробки» пользователем без административных прав, сразу после установки может использоваться без дополнительных настроек. Предназначена для обучения, имеет улучшенную визуализацию порядка вычисления выражений и вызова функций, динамическую подсветку синтаксических ошибок, простой менеджер пакетов. Для профессионального применения возможностей недостаточно, например, нет поддержки проектов и интеграции с системами управления версиями.

Помимо этого, существуют плагины для поддержки программирования на Python для универсальных IDE Eclipse, KDevelop и Microsoft Visual Studio, а также имеется поддержка подсветки синтаксиса, автодополнения кода и подключения средств отладки и запуска приложений для целого ряда распространённых текстовых редакторов.

Применение

Python — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. На Python реализовано большое количество проектов, также он активно используется для создания прототипов будущих программ.

Являясь приложением с открытым исходным кодом, интерпретатор Python используется по всему миру и поставляется в составе операционных систем на базе Linux, а также в компьютерах от фирмы Apple. Python популярен среди индивидуальных разработчиков, но также используется крупными компаниями в достаточно серьёзных продуктах, ориентированных на получение прибыли[131]. Язык активно используется в компанией Google в её поисковой системе, а видеохостинг Youtube в значительной степени написан с использованием Python[132][131]. В файловом хостинге Dropbox также активно применяется Python, а из-за сложностей динамической типизации и огромного количества кода компания перешла к статическому типизированию с помощью открытого проекта Mypy[133] Также Python активно используется компаниями Facebook[134] и Instagram[135]. Многие компании используют Python для тестирования аппаратного обеспечения, среди этих компания значатся Intel, Cisco, Hewlett-Packard и IBM. Industrial Light & Magic и Pixar используют его при создании анимационных фильмов[131].

Сочетание простоты и лаконичности с возможностью использования сложных абстракций и мощных разнообразных инструментов делает Python удобным в качестве скриптового языка. Многие проекты предоставляют прикладной интерфейс программирования на Python, позволяя использовать его в качестве скриптового языка, например, среды 3D-моделирования Maya[131] и Blender[136] и Houdini[137], а также свободная геоинформационная системы QGIS[138]. В Microsoft Power BI Desktop Python, наряду со встроенными языками запросов и языком программирования R, может использоваться на этапе загрузки данных в ETL-процессах, расчётах и графической визуализации данных[139][140]. Некоторые проекты реализуют базовую часть на более производительных языках программирования, а для упрощения работы предоставляют полноценный интерфейс прикладного программирования на Python. Так, движок свободного видеоредактора OpenShot реализован в виде библиотеки libopenshot, написанной на C++ с использованием библиотек на Си, а все возможности полностью покрыты прикладным интерфейсом программирования Python[141]. Агентство национальной безопасности США использует Python для анализа данных, а Национальное управление по аэронавтике и исследованию космического пространства США (NASA) использует его при выполнении научных задач[131]. Из инструментов, используемых в NASA, можно отметить свободный графический симулятор сети GNS3, который также хорошо зарекомендовал себя в корпоративной среде и используется в технологических компаниях, например, в Intel[142]. На Python написана также свободная популярная программа нарезки 3D моделей для печати на 3D-принтерах Cura[143][144].

Python с пакетами NumPy, SciPy и MatPlotLib активно используется как универсальная среда для научных расчётов в качестве замены распространённым специализированным коммерческим пакетам, таким как Matlab, предоставляя аналогичную функциональность и более низкий порог вхождения[145]. По большей части на Python написана также графическая программа Veusz[англ.][146], позволяющая создавать качественные графики, готовые для размещения в научных публикациях[147]. Библиотека Astropy — популярный инструмент для астрономических расчётов[148].

Также Python подходит для выполнения нестандартных или сложных задач в системах сборки проектов, что обусловлено отсутствием необходимости предварительной компиляции исходных файлов. В проекте Google Test он используется для генерации исходного кода mock-объектов для классов языка C++[149].

Интерпретатор Python может использоваться в качестве мощной командной оболочки и скриптового языка для написания командных файлов ОС. Лёгкость обращения из Python-скриптов к внешним программам и наличие библиотек, дающих доступ к управлению системой, делают Python удобным инструментом для системного администрирования[150]. Он широко используется для этой цели на платформе Linux: обычно Python поставляется с системой, во многих дистрибутивах инсталляторы и визуальный интерфейс системных утилит написаны именно на Python. Используется он и в администрировании других Unix-систем, в частности, в Solaris и macOS[150]. Кроссплатформенность самого языка и библиотек делает его привлекательным для унифицированной автоматизации задач системного администрирования в гетерогенных средах, где совместно применяются компьютеры с операционными системами различных типов.

Будучи языком общего назначения Python применим почти во всех сферах деятельности. Фактически Python используется практически любой солидной компанией тем или иным образом как для выполнения текущих задач, так и в тестировании, администрировании или в разработке программных продуктов[131].

См. также

Примечания

Комментарии

Источники

  1. 1 2 3 4 5 6 History and License - Python documentation
  2. Python 3.12.3 and 3.13.0a6 released (англ.) — 2024.
  3. https://impythonist.wordpress.com/2014/02/16/open-heart-with-guido-van-rosuuma-lost-interview-of-python-creator-part2/
  4. Why was Python created in the first place?Python Software Foundation.
  5. 1 2 Classes The Python TutorialPython Software Foundation.
  6. An Introduction to Python for UNIX/C Programmers
  7. https://peps.python.org/pep-0318/
  8. https://docs.python.org/3.2/tutorial/controlflow.html
  9. Functional Programming HOWTO
  10. 1 2 https://docs.python.org/3/library/itertools.html
  11. Download Python
  12. Мария «Mifrill» Нефедова, Создатели языков программирования: Они такие разные, но кодинг их объединяет, Хакер № 09/08 (117)
  13. Прохоренок Н., Дронов В. Введение // Python 3. Самое необходимое, 2-е изд.. — БХВ-Петербург, 2019. — С. 11. — 608 с. — ISBN 9785977539944.
  14. About Python
  15. Python 2.5 license (недоступная ссылка)
  16. Python | TIOBE - The Software Quality Company. www.tiobe.com. Дата обращения: 9 февраля 2020.
  17. The Making of Python
  18. Архивированная копия. Дата обращения: 1 июня 2009. Архивировано из оригинала 17 февраля 2016 года.
  19. Index of Python Enhancement Proposals (PEPs)
  20. Python 3.0 Release
  21. PEP 373 -- Python 2.7 Release Schedule. python.org. Дата обращения: 9 января 2017.
  22. PEP 466 -- Network Security Enhancements for Python 2.7.x. python.org. Дата обращения: 9 января 2017.
  23. Sunsetting Python 2 (англ.). Python.org. Дата обращения: 22 сентября 2019.
  24. PEP 373 -- Python 2.7 Release Schedule (англ.). Python.org. Дата обращения: 22 сентября 2019.
  25. Python Developer's Guide — Python Developer's Guide. devguide.python.org. Дата обращения: 17 декабря 2019.
  26. 1 2 General Python FAQ. Python v2.7.3 documentation. Docs.python.org. Дата обращения: 4 июня 2020.
  27. The Cain Gang Ltd. Python Metaclasses: Who? Why? When? Дата обращения: 27 июня 2009. Архивировано из оригинала 30 мая 2009 года.
  28. 3.3. Special method names. The Python Language Reference. Python Software Foundation. Дата обращения: 27 июня 2009.
  29. PyDBC: method preconditions, method postconditions and class invariants for Python. Дата обращения: 24 сентября 2011.
  30. Contracts for Python. Дата обращения: 24 сентября 2011.
  31. PyDatalog. Дата обращения: 22 июля 2012.
  32. Extending and Embedding the Python Interpreter: Reference Counts (англ.). Docs.python.org. — «Since Python makes heavy use of malloc() and free(), it needs a strategy to avoid memory leaks as well as the use of freed memory. The chosen method is called reference counting.» Дата обращения: 5 июня 2020.
  33. Hettinger, Raymond PEP 289 – Generator Expressions. Python Enhancement Proposals. Python Software Foundation (30 января 2002). Дата обращения: 19 февраля 2012.
  34. 6.5 itertools – Functions creating iterators for efficient looping. Docs.python.org. Дата обращения: 22 ноября 2016.
  35. PEP 20 — The Zen of Python
  36. Бейдер Дэн. Чистый Python. Тонкости программирования для профи. — "Издательский дом ""Питер""", 2018. — С. 64—65. — 288 с. — ISBN 978-5-4461-0803-9.
  37. Venners, Bill The Making of Python. Artima Developer. Artima (13 января 2003). Дата обращения: 22 марта 2007.
  38. Peters, Tim PEP 20 – The Zen of Python. Python Enhancement Proposals. Python Software Foundation (19 августа 2004). Дата обращения: 24 ноября 2008.
  39. Martelli, Alex. Python Cookbook, 2nd Edition / Alex Martelli, Anna Ravenscroft, David Ascher. — O'Reilly Media, 2005. — P. 230. — ISBN 978-0-596-00797-3.
  40. Python Culture. ebeab (21 января 2014). Архивировано из оригинала 30 января 2014 года.
  41. Mark Summerfield. Python in Practice: Create Better Programs Using Concurrency, Libraries, and Patterns. — Addison-Wesley, 2013-08-20. — С. 201. — 326 с. — ISBN 978-0-13-337323-3.
  42. 15 Ways Python Is a Powerful Force on the Web.
  43. 8.18. pprint — Data pretty printer — Python 3.8.3 documentation. docs.python.org.
  44. Python on Android (англ.). www.damonkohler.com. Дата обращения: 19 декабря 2009. Архивировано из оригинала 28 января 2011 года.
  45. Port-Specific Changes: Windows (англ.). Python v2.6.1 documentation. What’s New in Python 2.6. Python Software Foundation. Дата обращения: 11 декабря 2008. Архивировано из оригинала 28 января 2011 года.
  46. 3. Using Python on Windows — Python 3.5.9 documentation (англ.). Python Documentation. Python Software Foundation. Дата обращения: 8 июня 2020.
  47. Drop support of Windows Vista and 7 in Python 3.9 (англ.).
  48. Python Documentation — Built-in Types
  49. Ошибка Lua в Модуль:Languages на строке 145: attempt to index a nil value.
  50. Язык программирования Python изменится ради политкорректности
  51. Васильев, 2017, pp. 87—97.
  52. Васильев, 2017, pp. 97—106.
  53. Васильев, 2017, pp. 106—116.
  54. Васильев, 2017, pp. 116—126.
  55. 2.3.2. Reserved classes of identifiers. Python documentation (18 октября 2009). Архивировано из оригинала 28 января 2011 года.
  56. …целостность больших проектов на Python строится на двух вещах: тесты и doc-строка
  57. Python Generics
  58. [Python Generics]
  59. PEP318
  60. Python Tutorial: Decorators — Dynamically Alter The Functionality Of Your Functions
  61. Замыкания. Что это и с чем их едят? Дата обращения: 11 октября 2016. Архивировано из оригинала 11 октября 2016 года.
  62. python декораторы
  63. 6.2. re — Regular expression operations — Python 3.5.1 documentation
  64. eGenix.com — Professional Python Software, Skills and Services
  65. numarray Home Page
  66. PEP333
  67. Pyste Documentation. Дата обращения: 3 февраля 2007. Архивировано из оригинала 3 февраля 2007 года.
  68. Архивированная копия. Дата обращения: 3 февраля 2007. Архивировано из оригинала 8 февраля 2007 года.
  69. http://pyfortran.sourceforge.net/
  70. Boost.Python
  71. http://www.drdobbs.com/building-hybrid-systems-with-boostpython/184401666 Building Hybrid Systems with Boost.Python
  72. PyCXX: Write Python Extensions in C
  73. Мост между C++ и Python
  74. PyInline: Mix Other Languages directly Inline with your Python
  75. Weave. Дата обращения: 3 февраля 2007. Архивировано из оригинала 1 марта 2007 года.
  76. wxPython
  77. The GTK Team. The GTK Project - A free and open-source cross-platform widget toolkit (англ.). The GTK Team (5 июня 2015). Дата обращения: 25 января 2021. Архивировано 25 января 2021 года.
  78. PyOpenGL — The Python OpenGL Binding
  79. PyOgre : Ogre Wiki. Дата обращения: 9 февраля 2007. Архивировано из оригинала 6 февраля 2007 года.
  80. pythonOCC, 3D CAD/CAE/PLM development framework for the Python programming language
  81. Open CASCADE Technology, 3D modeling & numerical simulation
  82. Typechecking module for Python. Дата обращения: 10 февраля 2007. Архивировано из оригинала 4 февраля 2007 года.
  83. Method signature checking decorators " Python recipes " ActiveState Code
  84. PEP-3107
  85. FrontPage — The PEAK Developers' Center
  86. PEAK-Rules
  87. PEP-3124
  88. overloading-lib, Библиотека динамической перегрузки функций и методов основанной на типах аргументов для языка python
  89. PyChecker: a python source code checking tool
  90. pylint (analyzes Python source code looking for bugs and signs of poor quality.) (Logilab.org)
  91. Pylint 1.0.0 documentation, Introduction
  92. 1 2 Foreword for «Programming Python» (1st ed.)
  93. The Making of Python
  94. Результаты одной из попыток сравнения Архивировано 31 августа 2012 года.
  95. 1 2 zephyrfalcon.org :: labs :: 10 Python pitfalls
  96. Reeta Sahoo, Gagan Sahoo. Computer Science with Python. — New Delhi: New Saraswati House India Pvt Ltd, 2016. — С. 3.35—3.36. — 458 с. — ISBN 978-93-5199-980-5.
  97. Luciano Ramalho. Python tuples: immutable but potentially changing - O'Reilly Radar (англ.). radar.oreilly.com. O'Reilly (15 октября 2014). Дата обращения: 16 января 2021. Архивировано 16 января 2021 года.
  98. 8. Compound statements — Python 3.7.2 documentation. docs.python.org. Дата обращения: 5 февраля 2019.
  99. Python / C++ GNU g++. Computer Language Benchmarks Game. ???. Дата обращения: 1 июля 2009. Архивировано из оригинала 28 января 2011 года.
  100. unladen-swallow. A faster implementation of Python. code.google. — «Goals: … Produce a version of Python at least 5x faster than CPython». Дата обращения: 22 июня 2009. Архивировано из оригинала 28 января 2011 года.
  101. 1 2 Python for S60 — OpenSource Архивировано 6 августа 2009 года.
  102. What’s New In Python 3.2 — Python v3.2b2 documentation
  103. Python-Dev] Reworking the GIL
  104. Python 3000 FAQ
  105. 1 2 python-safethread — Project Hosting on Google Code
  106. Python Package Index : processing 0.52
  107. perlthrtut — perldoc.perl.org
  108. Parallel Python — Home. Дата обращения: 8 августа 2007. Архивировано из оригинала 28 мая 2010 года.
  109. pyMPI.sourceforge.net: Putting the py in MPI
  110. IronPython
  111. Python for .NET
  112. The Jython Project
  113. PEP 3146 — Merging Unladen Swallow into CPython
  114. QINSB is not a Software Blog: Unladen Swallow Retrospective
  115. tinypy
  116. MicroPython
  117. Сайт проекта Brython.
  118. Сайт проекта QPython.
  119. Создатель Питона: я устал, я ухожу
  120. «python-committers» Transfer of power — Guido van Rossum
  121. What’s New In Python 3.0 — Python v3.0.1 documentation Архивировано 15 августа 2014 года.
  122. The Python 3.6 Tutorial
  123. Python 3 Cookbook. Дата обращения: 2 ноября 2017. Архивировано из оригинала 2 ноября 2017 года.
  124. Dive Into Python 3 (англ.). http://www.diveintopython3.net. Apress.
  125. PyPy[coding-guide]. Дата обращения: 24 июля 2007. Архивировано из оригинала 7 июля 2007 года.
  126. PyPy carbonpython. Дата обращения: 24 июля 2007. Архивировано из оригинала 12 сентября 2007 года.
  127. Pyrex
  128. Cython: C-Extensions for Python
  129. Архивированная копия. Дата обращения: 1 июня 2006. Архивировано из оригинала 4 августа 2018 года.
  130. bpython interpreter
  131. 1 2 3 4 5 6 Mark Lutz. Learning Python: Powerful Object-Oriented Programming (англ.). — O'Reilly Media, Inc., 2009-10-06. — P. 7—8. — 1218 p. — ISBN 978-1-4493-7932-2.
  132. Grumpy: Go running Python! — статья в Google Open Source Blog
  133. Jukka Lehtosalo. Our journey to type checking 4 million lines of Python (англ.). dropbox.tech. Dropbox (5 сентября 2019). Дата обращения: 22 сентября 2020. Архивировано 22 сентября 2020 года.
  134. Python in production engineering
  135. What Powers Instagram: Hundreds of Instances, Dozens of Technologies
  136. Scripting & Extending Blender : Introduction (англ.). Blender Manual. Blender. Дата обращения: 21 сентября 2020. Архивировано 21 сентября 2020 года.
  137. Python Scripting (англ.). www.sidefx.com. Дата обращения: 27 сентября 2020.
  138. Building a plugin for QGIS (англ.). Geographic Informations Systems (GIS) Program. National Center for Atmospheric Research. Дата обращения: 23 сентября 2020. Архивировано 23 сентября 2020 года.
  139. Запустить сценарий Python в Power BI Desktop
  140. Как Microsoft забыла про полмира или читайте сообщения об ошибках
  141. Jonathan Thomas. OpenShot Video Editor for Windows, Mac, and Linux (англ.). Kickstarter (4 марта 2020). Дата обращения: 23 сентября 2020. Архивировано 23 сентября 2020 года.
  142. Using GNS3 with Fedora (амер. англ.). Fedora Magazine (28 августа 2019). Дата обращения: 22 сентября 2020.
  143. Ultimaker Cura GitHub
  144. natol Locker. 2020 Best 3D Printer Slicer Software (англ.). All3DP (2 января 2020). — «The list is sorted by popularity (via Alexa rank)». Дата обращения: 24 сентября 2020.
  145. Peter Jurica, Cees Van Leeuwen. OMPC: an open-source MATLAB®-to-Python compiler (англ.) // Frontiers in Neuroinformatics. — 2009. — Т. 3. — ISSN 1662-5196. — doi:10.3389/neuro.11.005.2009.
  146. Veusz Development (англ.). Veusz. Github Pages. Дата обращения: 2 октября 2020. Архивировано 2 октября 2020 года.
  147. Fisher, M. Plot with a purpose : [арх. 2 октября 2020] // Writing for Conservation : [англ.]. — Fauna & Flora International, Cambridge, 2019.
  148. The Astropy Collaboration, A. M. Price-Whelan, B. M. Sipőcz, H. M. Günther, P. L. Lim, S. M. Crawford, S. Conseil, D. L. Shupe, M. W. Craig, N. Dencheva. The Astropy Project: Building an Open-science Project and Status of the v2.0 Core Package : [англ.] : [арх. 3 октября 2020] // The Astronomical Journal. — 2018. — Т. 156, вып. 3 (24 August). — С. 123. — ISSN 1538-3881. — doi:10.3847/1538-3881/aabc4f.
  149. The Google Mock class generator README. Google Test. github.com.
  150. 1 2 Noah Gift, Jeremy M. Jones. Python for Unix and Linux System Administration. — ISBN 978-0-596-51582-9.

Литература

На русском языке
На английском языке
  • 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. Invent Your Own Computer Games with Python. — 2008—2010. — 436 с. — ISBN 978-0-9821060-1-3. Архивная копия от 26 января 2012 на Wayback Machine
  • A. Sweigart. Core Python Applications Programming. — 2012. — 888 с. — ISBN 978-0-1326782-0-9.


Ссылки