Python

Материал из Википедии — свободной энциклопедии
Версия от 01:26, 26 марта 2026; imported>Alex NB OT (проект Check Wikipedia: исправление ошибки 81)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Ошибка скрипта: Модуля «hatnote» не существует.{{#if: | }} Шаблон:Язык программирования Python (МФА: {{#if: | [ˈpaɪθ(ə)n] | [ˈpaɪθ(ə)n] }}; в русском языке встречаются названия пито́н<ref>Шаблон:Cite web</ref> или па́йтон<ref>Шаблон:Книга</ref>) — мультипарадигменный<ref name=":21">Шаблон:Источник информации</ref> высокоуровневый язык программирования общего назначения с динамической строгой типизацией и автоматическим управлением памятью<ref name=":6">Шаблон:Источник информации</ref><ref>Шаблон:Cite web</ref>, ориентированный на повышение производительности разработчика, читаемости кода и его качества, а также на обеспечение переносимости написанных на нём программ<ref name=":1">Шаблон:Cite web</ref>. Язык является полностью объектно-ориентированным в том плане, что всё является объектами<ref>Шаблон:Источник информации</ref>. Необычной особенностью языка является выделение блоков кода отступами<ref>Шаблон:Cite web</ref>. Синтаксис ядра языка минималистичен, за счёт чего на практике редко возникает необходимость обращаться к документации<ref name=":1" />. Поскольку Python является интерпретируемым языком, он также является и скриптовым<ref>Шаблон:Источник информации</ref>. Недостатками языка являются зачастую более низкая скорость работы и более высокое потребление памяти написанными на нём программами по сравнению с аналогичным кодом, написанным на компилируемых языках, таких как C или C++<ref>Шаблон:Источник информации</ref><ref name=":1" />.

Python является мультипарадигменным языком программирования, поддерживающим императивное, процедурное<ref name=":21" />, структурное<ref>Шаблон:Источник информации</ref>, функциональное<ref name=":21" />, асинхронное<ref name=":23" />, объектно-ориентированное<ref name=":21" /> программирование и метапрограммирование<ref name=":12" />. Задачи обобщённого программирования решаются за счёт динамической типизации<ref name=":8" /><ref name=":9" />. Аспектно-ориентированное программирование частично поддерживается через декораторы<ref name=":13">Шаблон:Cite web</ref>, более полноценная поддержка обеспечивается дополнительными фреймворками<ref>Шаблон:Статья</ref>. Такие методики как контрактное и логическое программирование можно реализовать с помощью библиотек или расширений<ref>Шаблон:Книга</ref>. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью<ref>Шаблон:Источник информации</ref><ref name=":6" />, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений с глобальной блокировкой интерпретатора (GIL)<ref>Шаблон:Cite web</ref>, высокоуровневые структуры данных. Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты<ref>Шаблон:Cite web</ref>.

Эталонной реализацией Python является интерпретатор CPython, который поддерживает большинство активно используемых платформ<ref>Шаблон:Cite web</ref>, являющийся стандартом де-факто языка<ref>Шаблон:Cite web</ref>. Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные<ref>Шаблон:Cite web</ref>. CPython компилирует исходные тексты в высокоуровневый байт-код, который исполняется в стековой виртуальной машине<ref name=":18">Шаблон:Статья</ref>. К другим трём основным реализациям языка относятся Jython (для JVM), IronPython (для CLR/.NET) и PyPy<ref>Шаблон:Источник информации</ref><ref name=":3" />. PyPy написан на подмножестве языка Python (RPython) и разрабатывался как альтернатива CPython с целью повышения скорости исполнения программ, в том числе за счёт использования JIT-компиляции<ref name=":3" />. Поддержка версии Python 2 закончилась в 2020 году<ref name="python-8468">Шаблон:Cite web</ref>. На текущий момент активно развивается версия языка Python 3<ref name=":5">Шаблон:Статья</ref>. Разработка языка ведётся через предложения по расширению языка PEP (англ. Шаблон:Lang-en2), в которых описываются нововведения, делаются корректировки согласно обратной связи от сообщества и документируются итоговые решения<ref>Шаблон:Источник информации</ref>.

Стандартная библиотека включает в себя большой набор полезных модулей, включая специфичные для отдельных платформ<ref>Шаблон:Источник информации</ref>, с функциями от работы с текстом до средств для написания сетевых приложений<ref name=":26">Шаблон:Источник информации</ref><ref name=":25">Шаблон:Cite web</ref>. Дополнительные возможности, такие как математическое моделирование, работа с оборудованием, написание веб-приложений или разработка игр, могут реализовываться посредством обширного количества сторонних библиотек, а также интеграцией библиотек, написанных на Си или C++, при этом и сам интерпретатор Python может интегрироваться в проекты, написанные на этих языках<ref name=":2">Шаблон:Статья</ref>Шаблон:Проверить авторитетность. Существует и специализированный репозиторий программного обеспечения, написанного на Python, — PyPI<ref name=":10">Шаблон:Статья</ref>. Данный репозиторий предоставляет средства для простой установки пакетов в операционную систему и стал стандартом де-факто для Python<ref>Шаблон:Книга</ref>. По состоянию на 2019 год в нём содержалось более 175 тысяч пакетов<ref name=":10" />.

Python стал одним из самых популярных языков<ref name=":26" />, он используется в анализе данных, машинном обучении, веб-разработке, разработке игр<ref>Шаблон:Источник информации</ref>, написании скриптов и DevOps<ref>Шаблон:Источник информации</ref>. За счёт читабельности, простого синтаксиса, близости к естественному языку и схожести с псевдокодом язык хорошо подходит для обучения программированию, помогая развивать вычистельное мышление (включающее в себя алгоритмическое мышление)<ref>Шаблон:Источник информации</ref><ref name=":14">Шаблон:Источник информации</ref>. Отладка же и экспериментирование в значительной степени облегчаются тем фактом, что язык является интерпретируемым<ref>Шаблон:Источник информации</ref><ref name=":14" />. Хорошая читабельность кода также упрощает отладку<ref>Шаблон:Источник информации</ref>, хотя при использовании языка в процессе обучения могут возникать сложности с пониманием ошибок (отсутствие соединения с сервером, ошибка чтения файла и т. п.) в вызовах сторонних функций, выполняющих комплексные задачи<ref>Шаблон:Источник информации</ref>. Применяется язык многими крупными компаниями, такими как Google или NASA<ref>Шаблон:Источник информации</ref>.

История

Шаблон:Main

Логотип, использовавшийся с 1990-х до 2006 года
Гвидо ван Россум в 2006 году на OSCON в Портленде (штат Орегон)

Задумка по реализации языка появилась в конце 1980-х годов, а разработка его реализации началась в 1989 году сотрудником голландского института CWI Гвидо ван Россумом<ref name=":7">Шаблон:Статья</ref>Шаблон:Проверить авторитетность. Для распределённой операционной системы Amoeba требовался расширяемый скриптовый язык, и Гвидо начал разрабатывать Python на досуге, позаимствовав некоторые наработки для языка ABC (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале 1991 года Гвидо опубликовал исходный текст в группе новостей alt.sources<ref>Шаблон:Cite web</ref>. С самого начала Python проектировался как объектно-ориентированный язык.

Гвидо ван Россум назвал язык в честь популярного британского комедийного телешоу 1970-х «Летающий цирк Монти Пайтона»<ref name="AutoNT-24" />, поскольку автор был поклонником этого телешоу, как и многие другие разработчики того времени, а в самом шоу прослеживалась некая параллель с миром компьютерной техники<ref name=":1" />.

Наличие дружелюбного, отзывчивого сообщества пользователей считается, наряду с дизайнерской интуицией Гвидо, одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (англ. Шаблон:Lang-en2) — предложений по развитию Python<ref>Шаблон:Cite web</ref>.

3 декабря 2008 года<ref>Шаблон:Cite web</ref>, после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется сокращение Py3k). В Python 3 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python.

Дата окончания срока поддержки Python 2.7 первоначально была установлена на 2015 год, а затем перенесена на 2020 год из опасения, что большая часть существующего кода не может быть легко перенесена на Python 3<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>. Поддержка Python 2 была направлена лишь на уже существующие проекты, новые проекты должны были использовать Python 3<ref name=":5" />. Официально Python 2.7 не поддерживается с 1 января 2020 года, хотя последнее обновление вышло в апреле 2020. Больше никаких исправлений безопасности или других улучшений для Python 2.7 не будет выпущено<ref name="python-8468" /><ref>Шаблон:Cite web</ref>. С окончанием срока службы Python 2.x поддерживаются только Python 3.6.x и более поздние версии<ref>Шаблон:Cite web</ref>.

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

Шаблон:Main

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

Язык использует динамическую типизацию вместе с подсчётом ссылок и циклический сборщик мусора для менеджмента памяти<ref name="Reference_counting">Шаблон:Cite web</ref>. Также есть динамические разрешения имён (динамическое связывание), которые связывают имена методов и переменных во время выполнения программы.

Python предлагает поддержку функционального программирования в традициях Лиспа. Так, в Python есть функции filter, map и reduce (начиная с Python 3, reduce находится в библиотеке functools)<ref>Шаблон:Cite web</ref>; также из Лиспа были заимствованы понятия характеристик списков, ассоциативных массивов (словарей), множеств и генераторов списков<ref name="AutoNT-59">Шаблон:Cite web</ref>. Стандартная библиотека содержит два модуля (itertools и functools), реализующих инструменты, заимствованные из Haskell и Standard ML<ref name="AutoNT-18">Шаблон:Cite web</ref>.

Шаблон:Якорь Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («Дзен Пито́на», или «Дзен Па́йтона»)<ref>Шаблон:Cite web</ref>. Её текст выдаётся интерпретатором Python по команде import this (работает один раз за сессию). Автором этой философии считается Тим Петерс (Tim Peters).

<templatestyles src="Шаблон:Начало_цитаты/styles.css" />{{#ifexpr: 0 mod 2 = 0 and 0 != 4 and 0 != 104 |

}}{{#if: Философия начинается так<ref>Шаблон:Книга</ref> |

Философия начинается так<ref>Шаблон:Книга</ref>:

}}

{{#ifexpr: 0 mod 2 = 0 and 0 != 4 and 0 != 104 |

}}

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

…. Шаблон:Oq{{#if:

| <templatestyles src="Шаблон:Конец цитаты/styles.css" />

}}

Вместо того, чтобы встроить в ядро Python всю функциональность языка, он был спроектирован таким образом, чтобы быть легко расширяемым. Это сделало язык популярным средством добавления программируемых интерфейсов к существующим приложениям. Видение Гвидо ван Россума маленького ядра с большой стандартной библиотекой и легко расширяемым интерпретатором проистекало из негативного опыта разработки языка ABC, который придерживался противоположного подхода<ref name="venners-interview-pt-1">Шаблон:Cite web</ref>.

Python стремится к более простому, менее громоздкому синтаксису и грамматике, предоставляя разработчикам выбор в их методологии кодирования. В отличие от девиза Perl «есть несколько способов сделать это», Python придерживается философии «должен существовать один — и, желательно, только один — очевидный способ сделать это»<ref name="PEP20">Шаблон:Cite web</ref>. Шаблон:Нп5, член Python Software Foundation и автор книг по Python пишет, что «Описывать что-то как „умное“ не считается комплиментом в культуре Python»<ref name="AutoNT-19">Шаблон:Cite book Шаблон:Wayback Шаблон:Cite web</ref>.

Разработчики Python стремятся избежать преждевременной оптимизации и отвергают патчи к некритическим частям эталонной реализации CPython, которые могли бы предложить незначительное увеличение скорости за счёт понятности кода<ref name="AutoNT-20">Шаблон:Cite web</ref>. Однако есть способы повышения производительности. Если в программе есть узкие места, связанные с выполнением ресурсоёмких операций на центральном процессоре, но не связанные с использованием операций ввода-вывода, то повысить производительность возможно за счёт трансляции программы при помощи Cython в язык Си и последующей компиляции<ref>Шаблон:Книга</ref>. Требовательные к вычислительным ресурсам части программы также можно переписывать на языке Си и подключать как отдельные библиотеки с привязками к Python<ref name=":3">Шаблон:Статья</ref>.

Важная цель разработчиков Python — делать его забавным для использования. Это было отражено в названии языка, данном в честь Монти Пайтона<ref name="AutoNT-24">Шаблон:Cite web</ref>. Также это отражено в иногда игривом подходе к обучающим программам и справочным материалам, таким как примеры программ из документаций, которые используют названия spam и eggs вместо использующихся в документации множества других языков foo и bar<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>.

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

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

По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с версии 2.6 прекращена поддержка Windows 95, Windows 98 и Windows ME<ref>Шаблон:Cite web</ref>. В версии 3.5 перестала поддерживаться Windows XP<ref>Шаблон:Cite web</ref> В версии 3.9 перестала поддерживаться Windows Vista и Windows 7<ref>Шаблон:Cite web</ref>.

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

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

Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». Также Python поддерживает подсказки типов с помощью аннотаций, добавляющие поддержку последовательной типизации и позволяющие использовать статический анализ кода<ref>Шаблон:Источник информации</ref>. Подсказки типов не используются во время компиляции и исполнения кода непосредственно CPython<ref>Шаблон:Источник информации</ref>, но могут использоваться некоторыми библиотеками, например, FastAPI. К примитивным типам в Python относятся булевый, целое число произвольной длины, число с плавающей запятой и комплексное число. Из контейнерных типов в Python встроены: строка, список, кортеж, словарь и множество<ref name=":14" />. Все значения являются объектами, в том числе функции, методы, модули, классы.

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

Типы, используемые в Python
Тип Изменяемость Описание Примеры
bool Неизменяемый Логический тип Шаблон:Code
Шаблон:Code
bytearray Изменяемый Массив байтов Шаблон:Code
Шаблон:Code
Шаблон:Code
bytes Неизменяемый Массив байтов Шаблон:Code
Шаблон:Code
Шаблон:Code
complex Неизменяемый Комплексное число Шаблон:Code
dict Изменяемый Словарь (ассоциативный массив), представляет собой коллекцию пар «ключ—значение»; значение может быть любого типа, ключ должен иметь хешируемый тип Шаблон:Code
Шаблон:Code
types.EllipsisType Неизменяемый Шаблон:Не переведено 5 (эллипсис). Используется в основном в NumPy для сокращённого задания среза многомерного массива. В самом Python присутствует для поддержки пользовательских типов и таких расширений, как NumPyШаблон:Sfn Шаблон:Code
Шаблон:Code
Для NumPy:
Шаблон:Code,
что эквивалентно
Шаблон:CodeШаблон:Sfn
float Неизменяемый Число с плавающей запятой. Степень точности зависит от платформы, но на практике обычно реализуется в виде 64-битного 53-разрядного числа<ref>Шаблон:Cite web</ref>

Шаблон:Code

frozenset Неизменяемый Неупорядочное множество, не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных Шаблон:Code
int Неизменяемый Целое число неограниченного размера<ref name="pep0237">Шаблон:Cite web</ref> Шаблон:Code
list Изменяемый Список, может содержать внутри себя различные типы данных Шаблон:Code
Шаблон:Code
NoneTypeШаблон:Ref+ Неизменяемый Объект, представляющий собой отсутствие значения, часто называемый Шаблон:Не переведено 5 в других языках. Шаблон:Code
NotImplementedTypeШаблон:Ref+ Неизменяемый Объект, который возвращается при перегрузке операторов, когда типы операндов не поддерживаются. Шаблон:Code
range Неизменяемый Последовательность целых чисел от какого-то одного значения до другого, обычно используется для повторения операции несколько раз при помощи for<ref>Шаблон:Cite web</ref> Шаблон:Code
Шаблон:Code
set Изменяемый Неупорядочное множество, не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных Шаблон:Code
Шаблон:Code
str Неизменяемый Строковый тип Шаблон:Code
Шаблон:Code
<syntaxhighlight lang="python">"""Spanning

multiple lines"""</syntaxhighlight>

tuple Неизменяемый Кортеж. Может содержать внутри себя различные типы данных. Может использоваться в качестве неизменяемого списка и в качестве записей с неименованными полямиШаблон:Sfn В качестве неизменяемого списка:
Шаблон:Code
Шаблон:Code
Шаблон:Code
В качестве записей:
Шаблон:Code
Шаблон:CodeШаблон:Sfn

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

Операторы

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

  • Условный оператор if (если). При наличии нескольких условий и альтернатив применяется необязательный блок elif(сокращение от else if), который может повторяться в коде неограниченное число раз. Если ни одно из условий не было соблюдено, то выполняется необязательный блок else (иначе).
  • Оператор цикла while.
  • Оператор итерации for.
  • Операторы обработки исключений try — except — else — finally.
  • Оператор определения класса class.
  • Оператор определения функции, метода или генератора def. Внутри возможно применение return (возврат) для возврата из функции или метода, а в случае генератора — yield (давать).
  • Оператор сопоставления с образцом match — case.
  • Операторы вызова исключений raise и assert.
  • Оператор pass ничего не делает. Используется для пустых блоков кода.

Система отступов

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

Сам Гвидо писал<ref name="foreword" />: <templatestyles src="Шаблон:Начало_цитаты/styles.css" />{{#ifexpr: 0 mod 2 = 0 and 0 != 4 and 0 != 104 |

}}{{#if: |

:

}}

{{#ifexpr: 0 mod 2 = 0 and 0 != 4 and 0 != 104 |

}} Наверное, самой спорной особенностью Python является использование отступов для группировки операторов, что взято непосредственно из ABC. Это одна из особенностей языка, которая дорога моему сердцу. Это делает код Python более читабельным двумя способами. Во-первых, использование отступов уменьшает визуальное нагромождение и делает программы короче, тем самым сокращая объём внимания, необходимого для восприятия базовой единицы кода. Во-вторых, это даёт программисту меньше свободы в форматировании, тем самым делая возможным более единообразный стиль, что облегчает чтение чужого кода (сравните, например, три или четыре различных соглашения о размещении фигурных скобок в Си, каждое из которых имеет сильных сторонников). Шаблон:Оригинальный текст {{#if:

| <templatestyles src="Шаблон:Конец цитаты/styles.css" />

}}

Выражения

Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок. Если сравнивать с математикой, то приоритеты операторов зеркалируют соответствующие в математике, при этом оператор присвоения значения = соответствует типографскому . Хотя приоритеты операций позволяют не использовать скобки во многих случаях, на анализ больших выражений может тратиться лишнее время, в результате чего в таких случаях выгоднее явно расставлять скобки<ref name=":5" />.

Отдельно стоит упомянуть операцию форматирования для строк (работает по аналогии с функцией printf() из Си), которая использует тот же символ, что и взятие остатка от деления: <source lang="python"> >>> str_var = "world" >>> print("Hello, %s" % str_var) Hello, world </source>

В версии 3.6 были добавлены форматированные строковые литералы, или f-строки, которые делают код более читаемым и лаконичным:<syntaxhighlight lang="python3"> >>> str_var = "world" >>> print(f"Hello, {str_var}") # вывод с использованием f-строки Hello, world </syntaxhighlight>Python имеет удобные цепочечные сравнения: <source lang="python"> 1 <= a < 10 and 1 <= b < 20 </source>

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

Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант): <source lang="python"> "строка и Юникод-строка одновременно" 'строка и Юникод-строка одновременно' """тоже строка и Юникод-строка одновременно""" 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)) # генератор </source>

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

Имена

Имя (идентификатор) может начинаться с буквы любого алфавита в Юникоде любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по import keyword; print(keyword.kwlist)) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение<ref>Шаблон:Cite web</ref>.

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

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

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

Python предлагает механизм документирования кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — docstring. Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации<ref>Шаблон:Cite web</ref> (переменная __doc__), что используется современными IDE.

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

Python — мультипарадигменный язык программирования. Полностью поддерживаются объектно-ориентированное, структурное<ref name=":6">Шаблон:Cite web</ref>, обобщённое<ref>Шаблон:Источник информации</ref>, функциональное программирование<ref name=":28">Шаблон:Источник информации</ref> и метапрограммирование<ref name=":12" />. Базовая поддержка аспектно-ориентированного программирования реализуется за счёт метапрограммирования<ref name=":13" />. Множество других методик, в том числе контрактное<ref name="AutoNT-15">Шаблон:Cite web</ref><ref name="AutoNT-16">Шаблон:Cite web</ref> и логическое программирование<ref name="AutoNT-17">Шаблон:Cite web</ref> можно реализовать с помощью расширений.

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

Дизайн языка Python построен вокруг объектно-ориентированной модели программирования (ООП). Реализация ООП в Python является хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками. В языке всё является объектами — либо экземплярами классов, либо экземплярами метаклассов. Исключением является базовый встроенный метакласс type. Таким образом, классы на самом деле являются экземплярами метаклассов, а производные метаклассы являются экземплярами метакласса type. Метаклассы являются частью концепции метапрограммирования и предоставляют возможность управления наследованием классов, что позволяет создавать абстрактные классы, регистрировать классы или добавлять в них какой-либо программный интерфейс в рамках библиотеки или фреймворка<ref name=":12" />.

Классы по своей сути представляют план или описание того, как создать объект, и хранят в себе описание атрибутов объекта и методов для работы с ним. Парадигма ООП основывается на инкапсуляции, наследовании и полиморфизме<ref name=":15" />. Инкапсуляция в Python представлена возможностью хранения публичных и скрытых атрибутов (полей) в объекте с предоставлением методов для работы с ними<ref name=":15" />, при этом на самом деле все атрибуты являются публичными, но для пометки скрытых атрибутов существует соглашение об именовании<ref name=":16" />. Наследование позволяет создавать производные объекты без необходимости повторного написания кода, а полиморфизм заключается в возможности переопределения любых методов объекта (в Python все методы являются виртуальными<ref name=":16">Шаблон:Cite web</ref>), а также в перегрузке методов и операторов. Перегрузка методов в Python реализуется за счёт возможности вызова одного и того же метода с разным набором аргументов<ref name=":15">Шаблон:Cite web</ref>. Особенностью Python является возможность модифицировать классы после их объявления, добавляя в них новые атрибуты и методы<ref name=":5" />, также можно модифицировать и сами объекты, в результате чего классы могут использоваться как структуры для хранения произвольных данных<ref name=":16" />.

В Python поддерживается множественное наследование<ref name=":24">Шаблон:Источник информации</ref>. Само по себе множественное наследование является сложным, и его реализации сталкиваются с проблемами разрешения коллизий имён между родительскими классами и с возможным повторным наследованием от одного и того же класса в иерархии<ref name=":24" />. В Python методы вызываются согласно порядку разрешения методов (MRO), который основан на алгоритме C3-линеаризации<ref name=":24" />, в обычных случаях при написании программ не требуется знать принцип работы данного алгоритма, понимание же может потребоваться при создании нетривиальных иерархий классов<ref>Шаблон:Cite web</ref>.

Возможности и особенности, специфичные для Python:

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

Языки с поддержкой динамической типизации и объектно-ориентированного программирования обычно не рассматриваются в рамках обобщённого программирования, поскольку задачи обобщённого программирования решаются за счёт отсутствия ограничений на типы данных<ref name=":8">Шаблон:Статья</ref><ref name=":9">Шаблон:Статья</ref>. В Python обобщённое программирование со строгой типизацией достигается использованием средств языка совместно со внешними анализаторами кода<ref>Шаблон:Cite web</ref>, такими как Mypy<ref>Шаблон:Cite web</ref>.

Несмотря на то, что Python изначально не задумывался как язык функционального программированияШаблон:Sfn, он поддерживает функциональный стиль программирования, в частности<ref name=":4">Шаблон:Книга</ref>:

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

Однако, в отличие от большинства языков, непосредственно ориентированных на функциональное программирование, Python не является чистым языком программирования и код не защищён от побочных эффектов<ref name=":4" />Шаблон:Sfn.

В стандартной библиотеке Python существуют специальные пакеты operator и functools для функционального программированияШаблон:Sfn.

Шаблон:Дополнить раздел Python поддерживает метапрограммированиеШаблон:Sfn<ref name=":12" />.

Шаблон:Дополнить раздел Python, начиная с 3.5, стал поддерживать асинхронное программирование. Появились операторы async и await, а также библиотека asyncio<ref name=":23" /><syntaxhighlight lang="python3"> import asyncio

async def main():

   print('Hello ...')
   await asyncio.sleep(1)
   print('... World!')

asyncio.run(main()) </syntaxhighlight>async является атрибутом, который создаёт асинхронную функцию<ref name=":23" />.

await позволяет выполнять асинхронные генераторы<ref name=":23" />.

Возможности

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

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

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

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

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

<source lang="python">

>>> class x(object):pass
....
>>> f = x()
>>> f.attr = 12
>>> print(f.__dict__)
{'attr': 12}
>>> print(x.__dict__)       # т.к. классы тоже являются экземплярами объекта type
                           # то и они поддерживают этот тип интроспекции
{'__dict__': <attribute '__dict__' of 'x' objects>, '__module__'.......

</source>

Есть также другие атрибуты, имена и назначение которых зависят от объекта:

<source lang="python">

>>> def f():pass
....
>>> f.func_code.co_code    # получение байтокода функции
'd\x00\x00S'
>>> f.__class__            # специальный атрибут - ссылка на класс данного объекта
<type 'function'>

</source>

Подавляющее большинство атрибутов, поддерживающих интроспекцию, является классовым, и их, в свою очередь, можно получить из obj.__class__.__dict__. Часть информации, унаследованную от базового класса, все объекты используют совместно, что позволяет экономить память.

Для удобства получения интроспективной информации в Python есть модуль inspectШаблон:Sfn.

<source lang="python">

>>> def f(x,y = 10,**mp):pass
...
>>> inspect.getargspec(f)
(['x', 'y'], None, 'mp', (10,))

</source>

С помощью модуля new возможен обратный процесс — построения объекта из составных частей на этапе исполнения

<source lang="python">

>>> def f(i): return j + i
....
>>> j = 2
>>> f(1)
3
>>> import new
>>> g = new.function(f.func_code, {'j': 23})
>>> g(1)
24

</source>

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

   # Здесь код, который может вызвать исключение
   raise Exception("message")  # Exception, это один из стандартных типов исключения (всего лишь класс),
                               # может использоваться любой другой, в том числе свой

except (Тип исключения1, Тип исключения2, …) as Переменная:

   # Код в блоке выполняется, если тип исключения совпадает с одним из типов
   # (Тип исключения1, Тип исключения2, …) или является наследником одного
   # из этих типов.
   # Полученное исключение доступно в необязательной Переменной.

except (Тип исключения3, Тип исключения4, …) as Переменная:

   # Количество блоков except не ограничено
   raise  # Сгенерировать исключение "поверх" полученного; без параметров - повторно сгенерировать полученное

except:

   # Будет выполнено при любом исключении, не обработанном типизированными блоками except

else:

   # Код блока выполняется, если не было поймано исключений.

finally:

   # Будет исполнено в любом случае, возможно после соответствующего
   # блока except или else

</source> Совместное использование 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 появились генераторные выражения — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами: <source lang="python"> >>> sum(i for i in range(1, 100) if i % 2 != 0) 2500 </source> В этом примере суммируются все нечётные числа от 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: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки.

Декораторы

Шаблон:Не путать Шаблон:Дополнить раздел Декораторы функций — вызываемые объекты, которые принимают другую функцию в качестве аргумента. Декораторы функций могут производить операции с функцией и возвращают либо саму функцию, либо другую заменяющую её функцию или вызываемый объект. То есть, если в коде ранее был прописан декоратор, названный decorate, то следующий кодШаблон:Sfn:

<syntaxhighlight lang="python">

@decorate def target():

   print('running target()')

</syntaxhighlight>

эквивалентен этомуШаблон:Sfn:

<syntaxhighlight lang="python">

def target():

   print('running target()')

target = decorate(target) </syntaxhighlight>

Это позволяет сократить использование кода.

Пример использования декоратора функцииШаблон:Sfn:

<syntaxhighlight lang="pycon">

>>> def deco(func): ... def inner(): ... print('running inner()') ... return inner … >>> @deco ... def target(): ... print('running target()') >>> target() running inner() >>> target <function deco.<locals>.inner at 0.10063b598> </syntaxhighlight>

Существуют декораторы классовШаблон:Sfn.

Формат регулярных выражений унаследован из Perl с некоторыми отличиями. Для их использования требуется импортировать модуль re<ref>Шаблон:Cite web</ref>, являющийся частью стандартной библиотеки.

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

Python поставляется «с батарейками в комплекте». Такую метафору использовали разработчики, чтобы подчеркнуть богатую стандартную библиотеку языка<ref>Шаблон:Cite news</ref>

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

Если модулей стандартной библиотеки не хватает, то есть возможность использовать другие каналы получения библиотек. Одним из каналов распространения и обновления пакетов для Python является PyPI (англ. Шаблон:Lang-en2)<ref>Шаблон:Cite web</ref>.

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

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

Программа «Hello World!» может быть написана одной строкой таким образом:<syntaxhighlight lang="python3"> print("Hello World!") </syntaxhighlight>

Ну или же вот таким:<syntaxhighlight lang="python3"> import __hello__ </syntaxhighlight>Вычисление факториала числа 10 (10!): <syntaxhighlight lang="python3"> 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

</syntaxhighlight>

Реализация с помощью рекурсии: <syntaxhighlight lang="python3"> 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)) </syntaxhighlight>

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

В стандартной библиотеке Python имеется профайлер (модуль profile), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модуль timeit. Производимые в следующей программе измерения позволяют выяснить, какой из вариантов конкатенации строк более эффективен<ref name=":22">Шаблон:Cite web</ref>: <syntaxhighlight lang="python"> 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))

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

Здесь есть несколько очевидных для опытных программистов правил<ref name=":22" />.

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

Python имеет следующие особенности и связанные с ними правила оптимизации<ref name=":22" />.

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

Инструмент под названием Pychecker<ref>Шаблон:Cite web</ref> поможет проанализировать исходный код на Python и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint<ref>Шаблон:Cite web</ref> призван решать близкие задачи, но имеет уклон в сторону проверки стиля кода, поиска кода с запашком<ref>Шаблон:Cite web</ref>.

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

Выбор языка обычно зависит от решаемых задач, особенностей языков и наличия библиотек, требуемых для решения задачи. Одна и та же задача, написанная на разных языках, может сильно разниться по эффективности исполнения, в том числе различия могут быть и при исполнении в разных операционных системах или при использовании разных компиляторов. В общем случае языки можно поделить на интерпретируемые (скриптовые), компилируемые в промежуточное представление и компилируемые, что влияет на производительность и потребление памяти. Python принято относить к интерпретируемым. Также отдельные языки могут иметь свои сильные стороны, в случае Python выделяется лёгкость в написании программ<ref name=":17" />.

Python сравнивается с C++/Java с точки зрения лаконичности, простоты и гибкости Python<ref name=":11" />. Можно сравнить «Hello, world»-программы, записанные на каждом из языков<ref name=":11" />.

Сравнение программ «Hello, world!»
C++<ref name=":11" /> Java<ref name=":11" /> Python<ref name=":11" />
<source lang="C++">
  1. include <iostream>

int main() {

   std::cout << "Hello, world!\n";
   return 0;

} </source> || <source lang="Java"> public class HelloClass {

   public static void main(String[] args) {
       System.out.println("Hello, world!");
   }

} </source> || <source lang="Python"> print("Hello, world!") </source>

Касательно ООП, в Python, в отличие от C++ и Java, отсутствуют модификаторы доступа к полям и методам класса, атрибуты и поля у объектов могут создаваться на лету в ходе исполнения программы, а все методы являются виртуальными. По сравнению с Java Python позволяет также перегружать операторы, что даёт возможность использовать выражения, близкие к естественным<ref name=":11" />. В совокупности подход к ООП в Python упрощает программирование, делает код более понятным и одновременно добавляет гибкости языку<ref name=":11" />. С другой стороны, скорость выполнения кода на Python (как и других интерпретируемых языков) значительно ниже, чем скорость выполнения аналогичного кода на C++<ref>Шаблон:Статья</ref> и обычно ожидается ниже, чем в Java<ref>Шаблон:Cite web</ref>. Код на C++ получается производительнее Python, при этом занимает больше строк. Согласно исследованиям алгоритмов, применяемых в биоинформатике, Python показал себя более гибким, чем C++, а Java оказалась компромиссным решением между производительностью C++ и гибкостью Python<ref name=":17">Шаблон:Статья</ref>.

В Java и Python все объекты создаются в куче, в то время как C++ позволяет создавать объекты как в куче, так и на стеке, в зависимости от используемого синтаксиса<ref name=":27">Шаблон:Источник информации</ref>. На производительность также влияет способ доступа к данным в памяти. В C++ и Java доступ к данным происходит по постоянным смещениям в памяти, в то время как в Python — через хеш-таблицы. Использование указателей в C++ может быть довольно сложным для понимания среди новичков, и овладение навыками правильного использования указателей может занять некоторое время<ref name=":17" />.

Шаблон:Дополнить раздел Go и Python — кардинально различающиеся языки, тем не менее, они часто сравниваются один с другим из-за общей ниши — бэкэнда веб-приложений. По выражению Джейсона Кинкэйда, Go объединяет «производительность и безопасность компилируемых языков, таких как C++, со скоростью разработки на динамических языках, таких как Python»<ref name="AutoNT-94">Шаблон:Cite news</ref>. В какой-то мере это действительно так: Go изначально разработан как строго статически типизированный компилируемый язык, поддерживающий максимум возможностей динамических языков, при котором ещё можно обеспечить эффективную компиляцию и сохранить производительность компилируемых программ. Общими для обоих языков является использование автоматического управления памятью, наличие встроенных динамических коллекций (массивов и словарей), поддержка срезов, развитый механизм модулей, простой и минималистичный синтаксис. Различий гораздо больше, и не всегда можно однозначно указать, в пользу какого из языков они говорят.

Динамические возможности.
Если Python является полностью динамическим языком и практически любые элементы программы могут меняться во время исполнения, включая конструирование «на лету» новых типов и модификацию существующих, то Go — статический язык с достаточно ограниченными возможностями рефлексии, работающей только в отношении созданных при разработке типов данных. В некоторой мере заменой динамических возможностей в Go является кодогенерация, обеспечиваемая простотой синтаксиса и наличием необходимых инструментов и системных библиотек. Также в Go 1.18 добавили поддержку средств обобщённого программирования (generics)<ref>Шаблон:Cite web</ref>.

Оба языка являются интерпретируемыми, компилируются в промежуточное представление, которое затем отправляется на исполнение. В случае Python генерируется промежуточный байт-код, а компилятор Perl генерирует синтаксическое дерево. Управление памятью в обоих языках автоматическое, а сами языки используются как скриптовые и хорошо подходят для написания веб-приложений. Подход в написания кода Python предполагает лучшее понимание листинга программы в ущерб производительности, тогда как в Perl больше свободы в синтаксисе, что может привести к тому, что программы на Perl становятся нечитабельны для программистов, не работающих с данным языком<ref name=":17" />.

Шаблон:Дополнить разделPython, MATLAB и R используются в обработке данных и в обучении студентов основам математики и статистики. R является языком для выполнения статистических расчётов, в то время как MATLAB может считаться языком программирования наряду с Python<ref>Шаблон:Статья</ref>.

Языки, на которые повлиял Python

Python, как весьма популярный язык программирования, повлиял на следующие языки:

  • CoffeeScript имеет синтаксис, вдохновлённый Python<ref>Шаблон:Книга</ref>.
  • ECMAScript/JavaScript заимствовал итераторы и генераторы из Python<ref name="AutoNT-93">Шаблон:Cite web</ref>.
  • Go, при сильнейших идеологических различиях, заимствовал у динамических языков, таких как Python, встроенные словари, динамические массивы, срезы.
  • Groovy был создан с мотивацией привнести философию Python на Java<ref name="AutoNT-95">Шаблон:Cite web</ref>.
  • Julia была задумана как «такая же пригодная для общего программирования, как и Python»<ref name="Julia">Шаблон:Cite web</ref>.
  • Nim использует систему отступов и аналогичный синтаксис<ref>Шаблон:Cite web</ref>.
  • Ruby — Юкихиро Мацумото, создатель языка, сказал: «Я хотел скриптовый язык, который был бы более мощным, чем Perl, и более объектно-ориентированным, чем Python. Вот почему я решил создать свой собственный язык»<ref name="linuxdevcenter">Шаблон:Cite web</ref>.
  • Swift во время разработки брал идеи структуры языка из Python, а также из Objective-C, Rust, Haskell, Ruby, C#, CLU<ref>Шаблон:Cite web</ref>.

Критика

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

Классический Python имеет общий со многими другими интерпретируемыми языками недостаток — сравнительно невысокую скорость выполнения программ<ref name="alioth-benchmark">Шаблон:Cite web</ref>. В некоторой степени ситуацию улучшает кеширование байт-кода (расширения .pyc и, до версии 3.5, .pyo), которое позволяет интерпретатору не тратить время на синтаксический разбор текста модулей при каждом запуске.

Существуют реализации языка Python, вводящие высокопроизводительные виртуальные машины в качестве бэкенда компилятора. Примерами таких реализаций может служить PyPy, базирующийся на RPython, более ранней инициативой является проект Parrot. Ожидается, что использование виртуальной машины типа LLVM приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где низкая вычислительная производительность в основном преодолена<ref>Шаблон:Cite web</ref>. Однако нельзя забывать, что динамический характер Python делает неизбежными дополнительные накладные расходы при исполнении программ, что ограничивает производительность Python-систем независимо от применяемых технологий. Вследствие этого для написания критических участков кода используются низкоуровневые языки, интеграция с которыми обеспечивается множеством программ и библиотек.

Тем не менее, Python портирован на некоторые относительно малопроизводительные платформы<ref>Шаблон:Cite web</ref>.

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

Схематичное изображение работы потоков под GIL. Зелёный — поток, удерживающий GIL, красные — блокированные потоки

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

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

Гвидо ван Россум говорил, что GIL «не так уж и плох» и он будет в CPython до тех пор, пока «кто-то другой» не представит реализацию Python без GIL, с которой бы однопоточные скрипты работали так же быстро<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>.

В задачи разработки входит работа по оптимизации GIL<ref>Шаблон:Cite web</ref>. Планируется отказ от GIL, есть черновой вариант PEP 703<ref name="автоссылка1">Шаблон:Cite web</ref>, но на данный момент есть следующие варианты избавления от GIL:

  • Вариант интерпретатора с синхронизацией доступа к отдельным объектам вместо глобальной блокировки<ref>Шаблон:Cite web</ref> из-за частых захватов/освобождений блокировок оказался слишком медленным.
  • Реализация потоков через процессы ОС, например, модуль multiprocessing<ref>Шаблон:Cite web</ref>.
  • Отказ от совместного использования изменяемых данных и вызовов внешнего кода. При этом данные дублируются в потоках и их синхронизация (если таковая нужна) лежит на программисте<ref>Шаблон:Cite web</ref>.
  • Библиотеки, обеспечивающие собственную организацию поддержки потоков.
  • Есть черновой PEP по отказу от GIL в CPython<ref name="автоссылка1" />

9 января 2023 года был принят PEP 703, в котором было предложено сделать GIL опциональным<ref name="автоссылка1" />. В Python 3.13, выход которого запланирован на октябрь 2024 года, добавлена экспериментальная опция для отключения GIL на этапе сборки интерпретатора<ref>Шаблон:Cite web</ref>. В ближайшие несколько релизов будут формироваться две сборки интерпретатора Python — с включённым и отключённым GIL (с несовместимыми ABI), но в будущем планируется добавить возможность отключать GIL на этапе выполнения<ref name="автоссылка1" />.

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

Несмотря на то, что одним из заявленных принципов дизайна Python является принцип наименьшего удивления, критики отмечают целый ряд архитектурных решений, которые могут вводить в заблуждение или вызывать недоумение у программистов, привыкших к другим распространённым языкам<ref name="pitfalls">Шаблон:Cite web</ref>. В их числе:

  • Отличие в принципе работы оператора присвоения по сравнению со статически-типизированными языками. В Python при присвоении значения копируется ссылка на объект, а не значение. При работе с простыми неизменяемыми типами возникает ощущение изменения значения переменной при присваивании ей значения, однако фактически присваивается ссылка на другое значение, например, при увеличении значения переменной типа int на 1 меняется ссылка, а не увеличивается значение по ссылке. Однако при работе с изменяемыми типами их содержимое можно менять по ссылке, поэтому при присвоении одной переменной ссылки на другую и последующем изменении значения в одной из двух переменных оно изменится в обеих переменных, что хорошо заметно при работе со списками<ref name="pitfalls" /><ref>Шаблон:Книга</ref>. При этом кортежи хоть и являются неизменяемыми, но могут хранить ссылки на изменяемые объекты, поэтому по факту кортежи тоже можно менять<ref>Шаблон:Cite web</ref>;
  • Отличие в поведении на некоторых типах «сокращённых» операторов, таких как += и их развёрнутой записи, хотя в большинстве языков «сокращённый» вариант — это просто краткая запись полного, и семантически они абсолютно эквивалентны. Пример с использованием x +=:<syntaxhighlight lang="python3" line="1">

>>> x = [1, 2] >>> y = x >>> x += [3, 4] >>> x [1, 2, 3, 4] >>> y [1, 2, 3, 4] </syntaxhighlight>Аналогичный пример с использованием x = x +:<syntaxhighlight lang="python3"> >>> x = [1, 2] >>> y = x >>> x = x + [3, 4] >>> x [1, 2, 3, 4] >>> y [1, 2] </syntaxhighlight>

  • Жёсткая трактовка лексической области видимости, подобная используемой в JavaScript: даже если переменная получает значение в последней строке функции, её областью видимости является вся функция.
  • Путаница между полями класса и полями объекта: текущее значение поля класса инициализирует одноимённое поле объекта, но не при создании объекта, а при первой записи значения в данное поле.<syntaxhighlight lang="python3">

class Colored:

   color = "red"

obj1 = Colored() print(obj1.color) # выводится исходное значение поля КЛАССА Colored.color = "green" # изменение поля КЛАССА print(obj1.color) # выводится значение поля КЛАССА obj1.color = "blue" # изменяется поле ОБЪЕКТА и фиксируется его значение Colored.color = "yellow" # изменение поля КЛАССА, которое уже не отразится на объекте print(obj1.color) # выводится поле ОБЪЕКТА

  1. Скрипт выведет:

red green blue </syntaxhighlight>

В примере выше три раза выводится поле color объекта obj1 класса Colored. При этом пока не выполнена запись в это поле, выводится текущее значение поля класса, и в третий раз — значение поля объекта. Такое сохранение связи между полем объекта и класса до первой перезаписи может стать причиной неожиданного эффекта: если в программе меняется значение поля класса, то все объекты, одноимённые поля которых ещё не перезаписаны, окажутся неявно изменены.
  • Интуитивно трудно предсказуемое поведение параметров со значением-объектом по умолчанию. Если в качестве инициализатора для параметра по умолчанию указать конструктор объекта, это приведёт к созданию статического объекта, ссылка на который и будет передаваться по умолчанию в каждый вызов<ref>Шаблон:Cite web</ref>. Это может повлечь трудно уловимые ошибки.

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

Шаблон:Дополнить раздел По сравнению с Ruby и некоторыми другими языками, в Python отсутствует возможность модифицировать встроенные классы<ref>Шаблон:Cite web</ref>, такие, как int, str, float, list и другие.

Реализации

CPython

Ошибка скрипта: Модуля «Основная статья» не существует. CPython является основной реализацией языка. Он написан на языке Си и является переносимым на разные платформы. В основе управления памятью лежит использование комбинации счётчиков ссылок и сборщика мусора, ответственного за поиск циклических захватов ссылок<ref name=":18" />. Хотя язык считается интерпретируемым, на самом деле он компилируется в промежуточный высокоуровневый байт-код<ref>Шаблон:Cite web</ref><ref name=":19" />, который затем исполняется через стековую виртуальную машину<ref name=":18" />. Например, вызов функции print() может быть представлен в следующем виде<ref name=":19">Получено с помощью dis.dis('print("Hello World!")').</ref>:

<syntaxhighlight lang="asm">

 0           0 RESUME                   0
 1           2 PUSH_NULL
             4 LOAD_NAME                0 (print)
             6 LOAD_CONST               0 ('Hello World!')
             8 PRECALL                  1
            12 CALL                     1
            22 RETURN_VALUE

</syntaxhighlight>

Имена в языке имеют позднее связывание, в результате чего можно писать обращения к переменным, методам и атрибутам, которых ещё нет, но они должны быть объявлены на момент исполнения кода, использующего их. Каждый объект в Python имеет словарь, представленный хеш-таблицей, через который происходит сопоставление названий атрибутов их значениям. Глобальные переменные также сопоставляются через словарь. Одно обращение к методу или атрибуту может сопровождаться поочерёдным поиском в нескольких словарях<ref name=":18" />.

PyPy

Ошибка скрипта: Модуля «Основная статья» не существует. 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.

Jython

Шаблон:Дополнить разделОшибка скрипта: Модуля «Основная статья» не существует. Jython — реализация Python, компилирующая код на Python в байт-код Java, который может быть выполнен JVM. Также может использоваться для импорта класса, исходный код которого был написан на Java в качестве модуля для PythonШаблон:Sfn.

Другие реализации

Существуют также другие реализации.

  • Шаблон:Iw — Jit-компилятор на основе LLVM с поддержкой NumPy.
  • PyS60<ref name="PyS60" /> — реализация языка для смартфонов фирмы Nokia на платформе Series 60. Не поддерживается
  • IronPython — Python для .NET Framework и Mono. Компилирует Python программы в MSIL, таким образом предоставляя полную интеграцию с .NET-системой<ref>Шаблон:Cite web</ref>.
  • Stackless — также написанная на Си реализация Python. Это не полноценная реализация, а патчи к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину рекурсии.
  • Python for .NET<ref>Шаблон:Cite web</ref> — ещё одна реализация Python для .NET. В отличие от IronPython эта реализация не компилирует Python код в MSIL, а только предоставляет интерпретатор, написанный на C#. Позволяет использовать .NET-сборки из Python кода.
  • Jython — реализация Python, использующая JVM в качестве среды исполнения. Позволяет прозрачно использовать Java-библиотеки.
  • TinyPy<ref>Шаблон:Cite web</ref> — минималистическая версия Python. Часть возможностей CPython не реализована.
  • MicroPython — реализация Python 3 для встроенных систем с малым объёмом оперативной памяти<ref>Шаблон:Cite web</ref>.
  • Brython<ref>Шаблон:Cite web</ref> — реализация языка на клиентском JavaScript, позволяющая писать браузерные скрипты на Python 3.
  • QPython<ref>Шаблон:Cite web</ref> — реализация Python для Android. Проект всё ещё на стадии тестирования, однако на QPython уже портированы некоторые самые необходимые библиотеки. Позволяет и работать в интерактивном режиме. Существует также Qpython3.

Специализированные подмножества/расширения Python

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

  • RPython<ref>Шаблон:Cite web</ref> — созданная в рамках проекта PyPy сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. Код на RPython можно компилировать во множество других языков/платформ — C, JavaScript, Lisp, .NET<ref>Шаблон:Cite web</ref>, LLVM. На RPython написан интерпретатор PyPy.
  • Cython<ref>Шаблон:Cite web</ref> — ограниченная реализация Python, но несколько меньше, чем RPython. Cython расширен возможностями статической типизации типами из языка C и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений, компилируется в код на языке C.
  • Nuitka<ref>Шаблон:Cite web</ref> — позволяет транслировать весь код Python в код Си или в исполняемые файлы.

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

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

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

  • Эталонная реализация Python имеет встроенный интерактивный интерпретатор, работающий в режиме текстового терминала и позволяющий выполнять все основные операции. В интерактивном режиме доступен отладчик pdb и система помощи (вызывается по help()), работающая для всех модулей, классов и функций, которые содержат строки документации:
<source lang="python3">

>>> from math import * # импорт математических функций >>> help(cos) # помощь по функции cos Help on built-in function cos in module math:

cos(x, /)

   Return the cosine of x (measured in radians).

</source>

  • IPython<ref>Шаблон:Cite web</ref> — выходящая под BSD-лицензией кросс-платформенная интерактивная оболочка, предоставляющая расширенную интроспекцию и дополнительные команды. В частности, позволяет передавать исполняемому коду на Python результаты выполнения команд системной командной оболочки. Поддерживает подсветку кода и автоматическое дополнение.
  • BPython<ref>Шаблон:Cite web</ref> — расширение стандартной командной оболочки Python с помощью ряда дополнительных модулей. Реализует подсветку синтаксиса, автоматическое дополнение кода с предложением вариантов, автоматическое выравнивание, интеграция с Pastebin, сохранение ввода в файл, восстановление удалённой строки, предложение параметров для функций.

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

IDE

IDLE

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

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

Помимо этого, существуют плагины для поддержки программирования на Python для универсальных IDE Eclipse<ref>Шаблон:Cite web</ref>, KDevelop<ref>Шаблон:Cite web</ref>, Visual Studio Code<ref>Шаблон:Cite web</ref> и Microsoft Visual Studio<ref>Шаблон:Cite web</ref>, а также имеется поддержка подсветки синтаксиса, авто дополнения кода и подключения средств отладки и запуска приложений для целого ряда распространённых текстовых редакторов.

Применение

Python Powered

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

Python является лёгким в изучении языком<ref>Шаблон:Источник информации</ref> и входит в число языков, которые наиболее часто изучаются в качестве первых<ref name=":27" />. В том числе Python используется при обучении детей программированию<ref>Шаблон:Статья</ref>. Как первый язык он хорошо подходит, поскольку программы на нём близки к естественному языку, на котором люди привыкли думать, а для написания корректной программы требуется минимальное количество ключевых слов. В других же языках, таких как C++, существует большое количество различных синтаксических конструкций и элементов языка, которым приходится уделять внимание вместо изучения алгоритмов<ref name=":11">Шаблон:Статья</ref>.

Являясь приложением с открытым исходным кодом, интерпретатор Python используется по всему миру и поставляется в составе операционных систем на базе Linux, а также в компьютерах от фирмы Apple. Python популярен среди индивидуальных разработчиков, но также используется крупными компаниями в достаточно серьёзных продуктах, ориентированных на получение прибыли<ref name=":0" />. На Python написаны Reddit и YouTube<ref>Шаблон:Источник информации</ref>. В Dropbox<ref>Шаблон:Cite web</ref> также активно применяется Python, а из-за сложностей динамической типизации и огромного количества кода компания перешла к статической типизации с помощью открытого проекта Mypy<ref>Шаблон:Cite web</ref> Также Python активно используется в Facebook<ref>Шаблон:Cite web</ref> и Instagram<ref>Шаблон:Cite web</ref>. Многие компании используют Python для тестирования аппаратного обеспечения, среди этих компаний значатся Intel, Cisco, Hewlett-Packard и IBM. Industrial Light & Magic и Pixar используют его при создании анимационных фильмов<ref name=":0" />.

Язык активно используется компанией Google в её поисковой системе, а YouTube в значительной степени написан с использованием Python<ref name=":0">Шаблон:Книга</ref><ref>Шаблон:Cite web — статья в Google Open Source Blog</ref>. Кроме того, Google спонсирует разработку Python с 2010 года<ref name=":20">Шаблон:Cite news</ref><ref>Шаблон:Cite news</ref>, и поддержку PyPI, основной системы распространения пакетов для Python<ref name=":20" /><ref>Шаблон:Cite news</ref>.

Сильными сторонами Python являются его модульность и возможность интегрироваться с другими языками программирования, в том числе в составе сложных комплексных приложений и систем<ref>Шаблон:Статья</ref>. Многие проекты предоставляют прикладной интерфейс программирования на Python для написания скриптов, например, среды 3D-моделирования Autodesk Maya<ref name=":0" />, Blender<ref>Шаблон:Cite web</ref> и Houdini<ref>Шаблон:Cite web</ref>, а также свободная геоинформационная система QGIS<ref>Шаблон:Cite web</ref>. Агентство национальной безопасности США использует Python для анализа данных, а NASA использует его при выполнении научных задач<ref name=":0" />. Из инструментов, используемых в NASA, можно отметить свободный графический симулятор сети Шаблон:Не переведено 5, который также хорошо зарекомендовал себя в корпоративной среде и используется в технологических компаниях, например, в Intel<ref>Шаблон:Cite web</ref>. На Python написана также свободная популярная программа нарезки 3D моделей для печати на 3D-принтерах Cura<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>.

Python с пакетами NumPy, SciPy и MatPlotLib активно используется как универсальная среда для научных расчётов в качестве замены распространённым специализированным коммерческим пакетам, таким как Matlab, предоставляя аналогичную функциональность и более низкий порог вхождения<ref>Шаблон:Статья</ref>.

Обладая обилием тематических инструментов и удобством для работы с большими данными, Python является лучшим языком программирования по использованию в ИИ-сфере и машинном обучении.<ref>Шаблон:Cite web</ref>

Интерпретатор Python может использоваться в качестве мощной командной оболочки и скриптового языка для написания командных файлов ОС. Лёгкость обращения из Python-скриптов к внешним программам и наличие библиотек, дающих доступ к управлению системой, делают Python удобным инструментом для системного администрирования<ref name="GiftJones">Шаблон:Публикация</ref>. Он широко используется для этой цели на платформе Linux: обычно Python поставляется с системой, во многих дистрибутивах инсталляторы и визуальный интерфейс системных утилит написаны именно на Python. Используется он и в администрировании других Unix-систем, в частности, в Solaris и macOS<ref name="GiftJones" />. Кроссплатформенность самого языка и библиотек делает его привлекательным для унифицированной автоматизации задач системного администрирования в гетерогенных средах, где совместно применяются компьютеры с операционными системами различных типов.

Будучи языком общего назначения, Python применим почти во всех сферах деятельности. Фактически Python используется практически любой солидной компанией тем или иным образом как для выполнения текущих задач, так и в тестировании, администрировании или в разработке программных продуктов<ref name=":0" />. Наибольшую популярность язык сыскал среди учёных по данных и инженеров в сфере машинного и глубокого обучения<ref>Шаблон:Cite web</ref><ref>Шаблон:Статья</ref>.

Примечания

Комментарии

Шаблон:Примечания

Источники

Шаблон:Примечания

Литература

Шаблон:Оформить литературу

Ссылки

Шаблон:Навигация

Шаблон:Python Шаблон:ВС