Python
| Python | |
|---|---|
| Семантика | Императивное,процедурное,структурное программирование,ООП[1],метапрограммирование[2],функциональное[1],асинхронное программирование[3] |
| Класс языка | объектно-ориентированный |
| Появился в | 20 февраля1991[5] |
| Автор | Гвидо ван Россум[5] |
| Расширение файлов | .py, .pyc, .pyo (до версии 3.5) |
| Выпуск | |
| Система типов | утинаядинамическаясильная (но возможны опциональные указания типов) |
| Испытал влияние | ABC[6] |
| Лицензия | Python Software Foundation License[5] |
| Сайт | python.org (англ.) |
| ОС | кроссплатформенность[7] |
Python (МФА:[ˈpaɪθ(ə)n]; в русском языке встречаются названияпито́н[8] илипа́йтон[9]) —мультипарадигменный[10]высокоуровневый язык программирования общего назначения сдинамическойстрогой типизацией и автоматическим управлением памятью[11][12], ориентированный на повышение производительности разработчика, читаемостикода и его качества, а также на обеспечение переносимости написанных на нём программ[13]. Язык является полностьюобъектно-ориентированным в том плане, что всё являетсяобъектами[14]. Необычной особенностью языка является выделениеблоков кода отступами[15].Синтаксис ядра языка минималистичен, за счёт чего на практике редко возникает необходимость обращаться к документации[13]. Поскольку Python являетсяинтерпретируемым языком, он также является искриптовым[16]. Недостатками языка являются зачастую более низкая скорость работы и более высокое потребление памяти написанными на нём программами по сравнению с аналогичным кодом, написанным накомпилируемых языках, таких какC илиC++[17][13].
Python являетсямультипарадигменным языком программирования, поддерживающимимперативное,процедурное[10],структурное[18],функциональное[10],асинхронное[3],объектно-ориентированное[10] программирование иметапрограммирование[2]. Задачиобобщённого программирования решаются за счёт динамической типизации[19][20].Аспектно-ориентированное программирование частично поддерживается черездекораторы[21], более полноценная поддержка обеспечивается дополнительнымифреймворками[22]. Такие методики какконтрактное илогическое программирование можно реализовать с помощью библиотек или расширений[23]. Основные архитектурные черты —динамическая типизация,автоматическое управление памятью[1],полная интроспекция, механизмобработки исключений, поддержкамногопоточных вычислений с глобальной блокировкой интерпретатора (GIL)[24], высокоуровневыеструктуры данных. Поддерживается разбиение программ намодули, которые, в свою очередь, могут объединяться в пакеты[25].
Эталонной реализацией Python является интерпретаторCPython, который поддерживает большинство активно используемых платформ[26], являющийсястандартом де-факто языка[27]. Он распространяется подсвободной лицензиейPython Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включаяпроприетарные[28]. CPython компилирует исходные тексты в высокоуровневыйбайт-код, который исполняется в стековой виртуальной машине[29]. К другим трём основным реализациям языка относятсяJython (дляJVM),IronPython (дляCLR/.NET) иPyPy[30][31]. PyPy написан на подмножестве языка Python (RPython) и разрабатывался как альтернатива CPython с целью повышения скорости исполнения программ, в том числе за счёт использованияJIT-компиляции[31]. Поддержка версии Python 2 закончилась в 2020 году[32]. На текущий момент активно развивается версия языка Python 3[33]. Разработка языка ведётся через предложения по расширению языкаPEP (англ. Python Enhancement Proposal), в которых описываются нововведения, делаются корректировки согласно обратной связи от сообщества и документируются итоговые решения[34].
Стандартная библиотека включает в себя большой набор полезных переносимых функций, начиная с возможностей для работы с текстом и заканчивая средствами для написания сетевых приложений. Дополнительные возможности, такие как математическое моделирование, работа с оборудованием, написание веб-приложений или разработка игр, могут реализовываться посредством обширного количества сторонних библиотек, а также интеграцией библиотек, написанных на Си или C++, при этом и сам интерпретатор Python может интегрироваться в проекты, написанные на этих языках[1]. Существует и специализированныйрепозиторий программного обеспечения, написанного на Python, —PyPI[35]. Данный репозиторий предоставляет средства для простой установки пакетов в операционную систему и стал стандартом де-факто для Python[36]. По состоянию на 2019 год в нём содержалось более 175 тысяч пакетов[35].
Python стал одним из самых популярных языков, он используется ванализе данных,машинном обучении,DevOps ивеб-разработке, а также в других сферах, включаяразработку игр. За счёт читабельности, простого синтаксиса и отсутствия необходимости в компиляции язык хорошо подходит для обучения программированию, позволяя концентрироваться на изучении алгоритмов, концептов и парадигм. Отладка же и экспериментирование в значительной степени облегчаются тем фактом, что язык является интерпретируемым[1][37]. Применяется язык многими крупными компаниями, такими какGoogle илиFacebook[1].
История
[править |править код]

Задумка по реализации языка появилась в конце1980-х годов, а разработка его реализации началась в 1989 году сотрудником голландского институтаCWIГвидо ван Россумом[38]. Для распределённой операционной системыAmoeba требовался расширяемыйскриптовый язык, и Гвидо начал разрабатывать Python на досуге, позаимствовав некоторые наработки для языкаABC (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале1991 года Гвидо опубликовал исходный текст вгруппе новостей alt.sources[39]. С самого начала Python проектировался какобъектно-ориентированный язык.
Гвидо ван Россум назвал язык в честь популярного британского комедийного телешоу1970-х «Летающий цирк Монти Пайтона»[40], поскольку автор был поклонником этого телешоу, как и многие другие разработчики того времени, а в самом шоу прослеживалась некая параллель с миром компьютерной техники[13].
Наличие дружелюбного, отзывчивого сообщества пользователей считается, наряду с дизайнерской интуицией Гвидо, одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (англ. Python Enhancement Proposal) — предложений по развитию Python[41].
3 декабря2008 года[42], после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используетсясокращение Py3k). В Python 3 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python.
Дата окончания срока поддержки Python 2.7 первоначально была установлена на 2015 год, а затем перенесена на 2020 год из опасения, что большая часть существующего кода не может быть легко перенесена на Python 3[43][44]. Поддержка Python 2 была направлена лишь на уже существующие проекты, новые проекты должны были использовать Python 3[33]. Официально Python 2.7 не поддерживается с 1 января 2020 года, хотя последнее обновление вышло в апреле 2020. Больше никаких исправлений безопасности или других улучшений для Python 2.7 не будет выпущено[32][45]. С окончанием срока службы Python 2.x поддерживаются только Python 3.6.x и более поздние версии[46].
Концепция и философия
[править |править код]
Язык используетдинамическую типизацию вместе сподсчётом ссылок и циклическийсборщик мусора дляменеджмента памяти[47]. Также есть динамическиеразрешения имён (динамическое связывание), которые связывают имена методов и переменных во время выполнения программы.
Python предлагает поддержку функционального программирования в традицияхЛиспа. Так, в Python есть функцииfilter,map иreduce (начиная с Python 3,reduce находится в библиотекеfunctools)[48]; также из Лиспа были заимствованы понятияхарактеристик списков,ассоциативных массивов (словарей),множеств и генераторов списков[49]. Стандартная библиотека содержит два модуля (itertools и functools), реализующих инструменты, заимствованные изHaskell иStandard ML[50].
Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («Дзен Пито́на», или «Дзен Па́йтона»)[51]. Её текст выдаётсяинтерпретатором Python по командеimport this (работает один раз за сессию). Автором этой философии считаетсяТим Петерс (Tim Peters).
Философия начинается так[52]:
- Красивое лучше, чем уродливое.
- Явное лучше, чем неявное.
- Простое лучше, чем сложное.
- Сложное лучше, чем запутанное.
….
Оригинальный текст (англ.)
- Beautiful is better than ugly.
- Explicit is better than implicit.
- Simple is better than complex.
- Complex is better than complicated.
...
Вместо того, чтобы встроить в ядро Python всю функциональность языка, он был спроектирован таким образом, чтобы быть легко расширяемым. Это сделало язык популярным средством добавления программируемых интерфейсов к существующим приложениям. Видение Гвидо ван Россума маленького ядра с большой стандартной библиотекой и легко расширяемым интерпретатором проистекало из негативного опыта разработки языкаABC, который придерживался противоположного подхода[53].
Python стремится к более простому, менее громоздкому синтаксису и грамматике, предоставляя разработчикам выбор в их методологии кодирования. В отличие от девизаPerl «есть несколько способов сделать это», Python придерживается философии «должен существовать один — и, желательно, только один — очевидный способ сделать это»[54].Алекс Мартелли[англ.], членPython Software Foundation и автор книг по Python пишет, что «Описывать что-то как „умное“ не считается комплиментом в культуре Python»[55].
Разработчики Python стремятся избежать преждевременной оптимизации и отвергают патчи к некритическим частям эталонной реализацииCPython, которые могли бы предложить незначительное увеличение скорости за счёт понятности кода[56]. Однако есть способы повышения производительности. Если в программе есть узкие места, связанные с выполнением ресурсоёмких операций на центральном процессоре, но не связанные с использованием операций ввода-вывода, то повысить производительность возможно за счёт трансляции программы при помощиCython в язык Си и последующей компиляции[57]. Требовательные к вычислительным ресурсам части программы также можно переписывать на языке Си и подключать как отдельные библиотеки с привязками к Python[31].
Важная цель разработчиков Python — делать его забавным для использования. Это было отражено в названии языка, данном в честьМонти Пайтона[40]. Также это отражено в иногда игривом подходе к обучающим программам и справочным материалам, таким как примеры программ из документаций, которые используют названия spam и eggs вместо использующихся в документации множества других языков foo и bar[58][59].
Портируемость
[править |править код]Pythonпортирован и работает почти на всех известных платформах — отКПК домейнфреймов. Существуют порты подMicrosoft Windows, практически под все вариантыUNIX (включаяFreeBSD иLinux),Android[60],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[61]. В версии 3.5 перестала поддерживатьсяWindows XP[62] В версии 3.9 перестала поддерживатьсяWindows Vista иWindows 7[63].
При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, MicrosoftCOM/DCOM). Более того, существует специальная версия Python длявиртуальной машины Java —Jython, что позволяет интерпретатору выполняться на любой системе, поддерживающейJava, при этом классы Java могут непосредственно использоваться из Python и даже быть написанными на Python. Также несколько проектов обеспечивают интеграцию с платформойMicrosoft.NET, основные из которых —IronPython и Python.NET.
Типы и структуры данных
[править |править код]
Python поддерживаетдинамическую типизацию, то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». Также Python поддерживает подсказки типов с помощью аннотаций, добавляющие поддержкупоследовательной типизации и позволяющие использовать статический анализ кода[64]. Подсказки типов не используются во время компиляции и исполнения кода непосредственноCPython[65], но могут использоваться некоторыми библиотеками, например,FastAPI. К примитивным типам в Python относятсябулевый, целое число произвольной длины, числос плавающей запятой икомплексное число. Из контейнерных типов в Python встроены:строка,список,кортеж,словарь имножество[37]. Все значения являются объектами, в том числе функции, методы, модули, классы.
Добавить новый тип можно либо написавкласс (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживаетнаследование (одиночное имножественное) иметапрограммирование. Возможно наследование от большинства встроенных типов и типов расширений.
| Тип | Изменяемость | Описание | Примеры |
|---|---|---|---|
bool | Неизменяемый | Логический тип | TrueFalse |
bytearray | Изменяемый | Массив байтов | bytearray(b'Some ASCII')bytearray(b"Some ASCII")bytearray([119,105,107,105]) |
bytes | Неизменяемый | Массив байтов | b'Some ASCII'b"Some ASCII"bytes([119,105,107,105]) |
complex | Неизменяемый | Комплексное число | 3+2.7j |
dict | Изменяемый | Словарь (ассоциативный массив), представляет собой коллекцию пар «ключ—значение»; значение может быть любого типа, ключ должен иметь хешируемый тип | {'key1':1.0,3:False}{} |
types.EllipsisType | Неизменяемый | Многоточие[англ.] (эллипсис). Используется в основном вNumPy для сокращённого задания среза многомерного массива. В самом Python присутствует для поддержки пользовательских типов и таких расширений, как NumPy[66] | ...EllipsisДляNumPy: x[i,...,j],что эквивалентно x[i,:,:,j][66] |
float | Неизменяемый | Число с плавающей запятой. Степень точности зависит от платформы, но на практике обычно реализуется в виде 64-битного 53-разрядного числа[67] |
|
frozenset | Неизменяемый | Неупорядочноемножество, не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных | frozenset([4.0,'string',True]) |
int | Неизменяемый | Целое число неограниченного размера[68] | 42 |
list | Изменяемый | Список, может содержать внутри себя различные типы данных | [4.0,'string',True][] |
NoneType[К 1] | Неизменяемый | Объект, представляющий собой отсутствие значения, часто называемыйNull[англ.] в других языках. | None |
NotImplementedType[К 1] | Неизменяемый | Объект, который возвращается приперегрузке операторов, когда типы операндов не поддерживаются. | NotImplemented |
range | Неизменяемый | Последовательность целых чисел от какого-то одного значения до другого, обычно используется для повторения операции несколько раз при помощи for[69] | range(1,10)range(10,-5,-2) |
set | Изменяемый | Неупорядочноемножество, не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных | {4.0,'string',True}set() |
str | Неизменяемый | Строковый тип | 'Wikipedia'"Wikipedia""""Spanningmultiplelines""" |
tuple | Неизменяемый | Кортеж. Может содержать внутри себя различные типы данных. Может использоваться в качестве неизменяемого списка и в качестве записей с неименованными полями[70] | В качестве неизменяемого списка:(4.0,'string',True)('single element',)()В качестве записей: lax_coordinates=(33.9425,-118.408056)city,year,pop,chg,area=('Tokyo',2003,32450,0.66,8014)[70] |
Синтаксис и семантика
[править |править код]Операторы
[править |править код]Набор операторов достаточно традиционен.
- Условный оператор
if(если). При наличии нескольких условий и альтернатив применяется необязательный блокelif(сокращение от else if), который может повторяться в коде неограниченное число раз. Если ни одно из условий не было соблюдено, то выполняется необязательный блокelse(иначе). - Оператор цикла
while. - Оператор итерации
for. - Операторы обработки исключений
try—except—else—finally. - Оператор определения класса
class. - Оператор определения функции, метода или генератора
def. Внутри возможно применениеreturn(возврат) для возврата из функции или метода, а в случае генератора —yield(давать). - Операторсопоставления с образцом
match—case. - Операторы вызова исключений
raiseиassert. - Оператор
passничего не делает. Используется для пустых блоков кода.
Система отступов
[править |править код]Одной из интересных синтаксических особенностей языка является выделениеблоков кода с помощью отступов (пробелов или табуляций), поэтому в Python отсутствуютоператорные скобки begin/end, как в языкеПаскаль, или фигурные скобки, как вСи. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Тем, кто привык программировать на языках с явным выделением начала и конца блоков, такое поведение поначалу может показаться неинтуитивным и неудобным.
Сам Гвидо писал[71]:
Наверное, самой спорной особенностью Python является использование отступов для группировки операторов, что взято непосредственно изABC. Это одна из особенностей языка, которая дорога моему сердцу. Это делает код Python более читабельным двумя способами. Во-первых, использование отступов уменьшает визуальное нагромождение и делает программы короче, тем самым сокращая объём внимания, необходимого для восприятия базовой единицы кода. Во-вторых, это даёт программисту меньше свободы в форматировании, тем самым делая возможным более единообразный стиль, что облегчает чтение чужого кода (сравните, например,три или четыре различных соглашения о размещении фигурных скобок вСи, каждое из которых имеет сильных сторонников).
Оригинальный текст (англ.)Perhaps Python's most controversial feature is its use of indentation for statement grouping, which derives directly from ABC. It is one of the language's features that is dearest to my heart. It makes Python code more readable in two ways. First, the use of indentation reduces visual clutter and makes programs shorter, thus reducing the attention span needed to take in a basic unit of code. Second, it allows the programmer less freedom in formatting, thereby enabling a more uniform style, which makes it easier to read someone else's code. (Compare, for instance, the three or four different conventions for the placement of braces in C, each with strong proponents.)
Выражения
[править |править код]Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок. Если сравнивать с математикой, то приоритеты операторов зеркалируют соответствующие в математике, при этом оператор присвоения значения= соответствует типографскому←. Хотя приоритеты операций позволяют не использовать скобки во многих случаях, на анализ больших выражений может тратиться лишнее время, в результате чего в таких случаях выгоднее явно расставлять скобки[33].
Отдельно стоит упомянутьоперацию форматирования для строк (работает по аналогии с функцией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<10and1<=b<20
Кроме того, логические операции (or иand) являютсяленивыми: если для вычисления значения операции достаточно первого операнда, этот операнд и является результатом, в противном случае вычисляется второй операнд логической операции. Это основывается на свойствахалгебры логики: например, если один аргумент операции «ИЛИ» (or) является истиной, то и результат этой операции всегда является истиной. В случае, если второй операнд является сложным выражением, это позволяет сократить издержки на его вычисление. Этот факт широко использовался до версии 2.5 вместо условной конструкции:
a<band"меньше"or"больше или равно"
Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант):
"строка и Юникод-строка одновременно"'строка и Юникод-строка одновременно'"""тоже строка и Юникод-строка одновременно"""TrueorFalse# булевы литералы3.14# число с плавающей запятой0b1010+0o12+0xA# числа в двоичной, восьмеричной и шестнадцатеричной системах счисления1+2j# комплексное число[1,2,"a"]# список(1,2,"a")# кортеж{'a':1,'b':'B'}# словарь{'a',6,8.8}# множествоlambdax:x**2# анонимная функция(iforiinrange(10))# генератор
Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись срезаs[N:M] означает, что в срез попадают все элементы от N включительно до M, не включая. При этом индекс можно не указывать. Например, записьs[:M] означает, что в срез попадают все элементы с самого начала; записьs[N:] означает, что попадают все элементы до конца среза; записьs[:] означает, что попадают все элементы с начала и до конца.
Имена
[править |править код]Имя (идентификатор) может начинаться с буквы любого алфавита вЮникоде любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать поimport keyword; print(keyword.kwlist)) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение[72].
В каждой точке программы интерпретатор имеет доступ к трёмпространствам имён (то есть отображениям имён в объекты): локальному, глобальному и встроенному.
Области видимости имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.
Строки документации
[править |править код]Python предлагает механизмдокументирования кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — docstring. Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации[73] (переменная__doc__), что используется современнымиIDE.
В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить doctest для автоматического тестирования модуля.
Python —мультипарадигменный язык программирования. Полностью поддерживаютсяобъектно-ориентированное,структурное[74],обобщённое,функциональное программирование[1] иметапрограммирование[2]. Базовая поддержкааспектно-ориентированного программирования реализуется за счёт метапрограммирования[21]. Множество других методик, в том числеконтрактное[75][76] илогическое программирование[77] можно реализовать с помощью расширений.
Объектно-ориентированное программирование
[править |править код]Дизайн языка Python построен вокругобъектно-ориентированной модели программирования (ООП). Реализация ООП в Python является хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками. В языке всё является объектами — либо экземплярами классов, либо экземплярами метаклассов. Исключением является базовый встроенный метаклассtype. Таким образом, классы на самом деле являются экземплярами метаклассов, а производные метаклассы являются экземплярами метаклассаtype. Метаклассы являются частью концепции метапрограммирования и предоставляют возможность управления наследованием классов, что позволяет создавать абстрактные классы, регистрировать классы или добавлять в них какой-либо программный интерфейс в рамкахбиблиотеки илифреймворка[2].
Классы по своей сути представляют план или описание того, как создать объект, и хранят в себе описание атрибутов объекта и методов для работы с ним. Парадигма ООП основывается наинкапсуляции,наследовании иполиморфизме[78]. Инкапсуляция в Python представлена возможностью хранения публичных и скрытыхатрибутов (полей) в объекте с предоставлениемметодов для работы с ними[78], при этом на самом деле все атрибуты являются публичными, но для пометки скрытых атрибутов существует соглашение об именовании[79]. Наследование позволяет создавать производные объекты без необходимости повторного написания кода, а полиморфизм заключается в возможности переопределения любых методов объекта (в Python все методы являютсявиртуальными[79]), а также в перегрузкеметодов иоператоров. Перегрузка методов в Python реализуется за счёт возможности вызова одного и того же метода с разным набором аргументов[78]. Особенностью Python является возможность модифицировать классы после их объявления, добавляя в них новые атрибуты и методы[33], также можно модифицировать и сами объекты, в результате чего классы могут использоваться как структуры для хранения произвольных данных[79].
В Python поддерживается множественное наследование. Само по себе множественное наследование является сложным, и его реализации сталкиваются с проблемами разрешения коллизий имён между родительскими классами и с возможным повторным наследованием от одного и того же класса в иерархии. В Python методы вызываются согласно порядку разрешения методов (MRO), который основан на алгоритмеC3-линеаризации[80], в обычных случаях при написании программ не требуется знать принцип работы данного алгоритма, понимание же может потребоваться при создании нетривиальных иерархий классов[81].
Возможности и особенности, специфичные для Python:
- Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы.
- Перегрузка операторов (всех, кроме
is, '.', '='и символьных логических). - Свойства (имитация поля с помощью функций).
- Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).
- Методы для управления наиболее распространёнными операциями (истинностное значение,
len(), глубокое копирование,сериализация, итерация по объекту, …). - Полнаяинтроспекция.
- Классовые и статические методы, классовые поля.
- Классы, вложенные в функции и классы.
- Возможность модифицировать объекты во время исполнения программы.
Языки с поддержкой динамической типизации и объектно-ориентированного программирования обычно не рассматриваются в рамках обобщённого программирования, поскольку задачи обобщённого программирования решаются за счёт отсутствия ограничений на типы данных[19][20]. В Python обобщённое программирование со строгой типизацией достигается использованием средств языка совместно со внешними анализаторами кода[82], такими как Mypy[83].
Несмотря на то, что Python изначально не задумывался как язык функционального программирования[84], он поддерживает функциональный стиль программирования, в частности[85]:
- функция является объектом первого класса,
- функции высших порядков,
- рекурсия,
- фокус на работу сосписками,
- аналогзамыканий,
- частичное применение функции с помощью метода
partial(), - возможность реализации других средств на самом языке (например,карринг).
Однако, в отличие от большинства языков, непосредственно ориентированных на функциональное программирование, Python не являетсячистым языком программирования и код не защищён отпобочных эффектов[85][86].
В стандартной библиотеке Python существуют специальные пакетыoperator иfunctools для функционального программирования[84].
Python поддерживаетметапрограммирование[87][2].
Комментарий: Асинхронное программирование на Python
Python, начиная с 3.5, стал поддерживать асинхронное программирование. Появились операторыasync иawait, а также библиотекаasyncio[3]
importasyncioasyncdefmain():print('Hello ...')awaitasyncio.sleep(1)print('... World!')asyncio.run(main())
async является атрибутом, который создаётасинхронную функцию[3].
await позволяет выполнять асинхронные генераторы[3].
Возможности
[править |править код]Модули и пакеты
[править |править код]Программное обеспечение (приложение или библиотека) на Python оформляется в виде модулей, которые в свою очередь могут быть собраны впакеты. Модули могут располагаться как вкаталогах, так и вZIP-архивах. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Python, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется операторомimport. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функциейreload().
Python поддерживает полнуюинтроспекцию времени исполнения[88]. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.
Применение интроспекции является важной частью того, что называют Pythonic style, и широко применяется в библиотеках ифреймворках Python, таких какPLY, Cherry,Django и др., значительно экономя время использующего их программиста.
Необходимые для интроспекции данные хранятся в специальных атрибутах. Так, например, получить все пользовательские атрибуты большинства объектов можно из специального атрибута — словаря (или другого объекта, предоставляющего интерфейсdict)__dict__
>>>classx(object):pass....>>>f=x()>>>f.attr=12>>>print(f.__dict__){'attr':12}>>>print(x.__dict__)# т.к. классы тоже являются экземплярами объекта type# то и они поддерживают этот тип интроспекции{'__dict__':<attribute'__dict__'of'x'objects>,'__module__'.......
Есть также другие атрибуты, имена и назначение которых зависят от объекта:
>>>deff():pass....>>>f.func_code.co_code# получение байтокода функции'd\x00\x00S'>>>f.__class__# специальный атрибут - ссылка на класс данного объекта<type'function'>
Подавляющее большинство атрибутов, поддерживающих интроспекцию, является классовым, и их, в свою очередь, можно получить изobj.__class__.__dict__. Часть информации, унаследованную от базового класса, все объекты используют совместно, что позволяет экономить память.
Для удобства получения интроспективной информации в Python есть модульinspect[89].
>>>deff(x,y=10,**mp):pass...>>>inspect.getargspec(f)(['x','y'],None,'mp',(10,))
С помощью модуляnew возможен обратный процесс — построения объекта из составных частей на этапе исполнения
>>>deff(i):returnj+i....>>>j=2>>>f(1)3>>>importnew>>>g=new.function(f.func_code,{'j':23})>>>g(1)24
Обработка исключений поддерживается в Python посредством операторовtry, except, else, finally, raise, образующих блок обработки исключения. В общем случае блок выглядит следующим образом:
try:# Здесь код, который может вызвать исключениеraiseException("message")# Exception, это один из стандартных типов исключения (всего лишь класс),# может использоваться любой другой, в том числе свойexcept(Типисключения1,Типисключения2,…)asПеременная:# Код в блоке выполняется, если тип исключения совпадает с одним из типов# (Тип исключения1, Тип исключения2, …) или является наследником одного# из этих типов.# Полученное исключение доступно в необязательной Переменной.except(Типисключения3,Типисключения4,…)asПеременная:# Количество блоков except не ограниченоraise# Сгенерировать исключение "поверх" полученного; без параметров - повторно сгенерировать полученноеexcept:# Будет выполнено при любом исключении, не обработанном типизированными блоками exceptelse:# Код блока выполняется, если не было поймано исключений.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(iforiinrange(1,100)ifi%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: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки.
Декораторы
[править |править код]Декораторы функций — вызываемые объекты, которые принимают другую функцию в качестве аргумента. Декораторы функций могут производить операции с функцией и возвращают либо саму функцию, либо другую заменяющую её функцию или вызываемый объект. То есть, если в коде ранее был прописан декоратор, названный decorate, то следующий код[90]:
@decoratedeftarget():print('running target()')
эквивалентен этому[90]:
deftarget():print('running target()')target=decorate(target)
Это позволяет сократить использование кода.
Пример использования декоратора функции[90]:
>>>defdeco(func):...definner():...print('running inner()')...returninner…>>>@deco...deftarget():...print('running target()')>>>target()running inner()>>>target<function deco.<locals>.inner at 0.10063b598>
Существуют декораторы классов[91].
Формат регулярных выражений унаследован изPerl с некоторыми отличиями. Для их использования требуется импортировать модульre[92], являющийся частью стандартной библиотеки.
Стандартная библиотека
[править |править код]
Богатая стандартнаябиблиотека является одной из привлекательных сторон Python. Здесь имеются средства для работы со многимисетевыми протоколами и форматамиИнтернета, например, модули для написанияHTTP-серверов и клиентов, для разбора и создания почтовых сообщений, для работы сXML и т. п. Набор модулей для работы соперационной системой позволяет писать кросс-платформенные приложения. Существуют модули для работы срегулярными выражениями, текстовымикодировками,мультимедийными форматами,криптографическими протоколами, архивами,сериализации данных, поддержкаюнит-тестирования и др.[94]
Если модулей стандартной библиотеки не хватает, то есть возможность использовать другие каналы получения библиотек. Одним из каналов распространения и обновления пакетов для Python являетсяPyPI (англ. Python Package Index)[95].
Сторонние библиотеки
[править |править код]Здесь перечислены самые популярные библиотеки Python:
- Искусственный интеллект —TensorFlow
- Работа с базами данных —SQLAlchemy
- Математические вычисления —NumPy,SciPy
- Веб-приложения —Django
- Создание игр —Pygame
- Визуализация данных —Matplotlib,Seaborn
- Обработка табличных данных —Pandas
- Машинное обучение —Scikit-learn
- Отправка сетевых запросов —Requests[англ.]
- Парсинг HTML-данных с веб-сайтов —BeautifulSoup[англ.]
- Парсинг веб-сайтов на основе симуляции человеческой деятельности —Selenium
- Математика — Math
- Черепаха — Turtle
Примеры программ
[править |править код]В статье «Примеры программ на языке Python»Викиверситета собраны примеры небольших программ, демонстрирующих некоторые возможности языка Python и его стандартной библиотеки.
Программа «Hello World!» может быть написана одной строкой таким образом:
print("Hello World!")
Ну или же вот таким:
import__hello__
Вычислениефакториала числа 10 (10!):
deffactorial(n):ifn<0:raiseArithmeticError('Факториал отрицательного числа.')f=1foriinrange(2,n+1):f*=ireturnfprint(factorial(10))# 3628800
Реализация с помощьюрекурсии:
deffactorial(n):ifn<0:raiseArithmeticError('Факториал отрицательного числа.')ifn==0orn==1:return1else:returnfactorial(n-1)*nprint(factorial(10))
Профилирование и оптимизация кода
[править |править код]В стандартной библиотеке Python имеетсяпрофайлер (модульprofile), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модульtimeit. Производимые в следующей программе измерения позволяют выяснить, какой из вариантовконкатенации строк более эффективен[96]:
fromtimeitimportTimertmp="Python 3.2.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32."defcase1():# А. инкрементальные конкатенации в циклеs=""foriinrange(10000):s+=tmpdefcase2():# Б. через промежуточный список и метод joins=[]foriinrange(10000):s.append(tmp)s="".join(s)defcase3():# В. списковое выражение и метод joinreturn"".join([tmpforiinrange(10000)])defcase4():# Г. генераторное выражение и метод joinreturn"".join(tmpforiinrange(10000))forvinrange(1,5):print(Timer("func()","from __main__ import case%s as func"%v).timeit(200))
Как и в любом языке программирования, в Python имеются свои приёмыоптимизации кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг с другом) критериев (увеличение быстродействия, уменьшение объёма требуемой оперативной памяти, компактность исходного кода и т. д.). Чаще всего программы оптимизируют по времени исполнения.
Здесь есть несколько очевидных для опытных программистов правил[96].
- Не нужно оптимизировать программу, если скорость её выполнения достаточна.
- Используемый алгоритм имеет определённуювременную сложность, поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм.
- Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Python есть встроенная функция
sorted(). - Профилирование поможет выяснить узкие места. Оптимизацию нужно начинать с них.
Python имеет следующие особенности и связанные с ними правила оптимизации[96].
- Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обработка той же последовательности в цикле вызовом функции.
- Старайтесь вынести из глубоко вложенного цикла всё, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным или чем доступ к полям.
- Оптимизаторpsyco может помочь ускорить работу модуля программы при условии, что модуль не использует динамических свойств языка Python.
- В случае, если модуль проводит массированную обработку данных и оптимизация алгоритма и кода не помогает, можно переписатькритические участки, скажем, на языке Си или Pyrex.
Инструмент под названием Pychecker[97] поможет проанализировать исходный код на Python и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint[98] призван решать близкие задачи, но имеет уклон в сторону проверки стиля кода, поискакода с запашком[99].
Сравнение с другими языками
[править |править код]Выбор языка обычно зависит от решаемых задач, особенностей языков и наличия библиотек, требуемых для решения задачи. Одна и та же задача, написанная на разных языках, может сильно разниться по эффективности исполнения, в том числе различия могут быть и при исполнении в разных операционных системах или при использовании разных компиляторов. В общем случае языки можно поделить на интерпретируемые (скриптовые), компилируемые в промежуточное представление и компилируемые, что влияет на производительность и потребление памяти. Python принято относить к интерпретируемым. Также отдельные языки могут иметь свои сильные стороны, в случае Python выделяется лёгкость в написании программ[100].
Python сравнивается с C++/Java с точки зрения лаконичности, простоты и гибкости Python[101]. Можно сравнить «Hello, world»-программы, записанные на каждом из языков[101].
| C++[101] | Java[101] | Python[101] |
|---|---|---|
#include<iostream>intmain(){std::cout<<"Hello, world!\n";return0;} | publicclassHelloClass{publicstaticvoidmain(String[]args){System.out.println("Hello, world!");}} | print("Hello, world!") |
Касательно ООП, в Python, в отличие от C++ и Java, отсутствуют модификаторы доступа к полям и методам класса, атрибуты и поля у объектов могут создаваться на лету в ходе исполнения программы, а все методы являются виртуальными. По сравнению с Java Python позволяет также перегружать операторы, что даёт возможность использовать выражения, близкие к естественным[101]. В совокупности подход к ООП в Python упрощает программирование, делает код более понятным и одновременно добавляет гибкости языку[101]. С другой стороны, скорость выполнения кода на Python (как и других интерпретируемых языков) значительно ниже, чем скорость выполнения аналогичного кода на C++[102] и обычно ожидается ниже, чем в Java[103]. Код на C++ получается производительнее Python, при этом занимает больше строк. Согласно исследованиям алгоритмов, применяемых вбиоинформатике, Python показал себя более гибким, чем C++, а Java оказалась компромиссным решением между производительностью C++ и гибкостью Python[100].
В Java и Python все объекты создаются вкуче, в то время как C++ позволяет создавать объекты как в куче, так и настеке, в зависимости от используемого синтаксиса[104]. На производительность также влияет способ доступа к данным в памяти. В C++ и Java доступ к данным происходит по постоянным смещениям в памяти, в то время как в Python — черезхеш-таблицы. Использованиеуказателей в C++ может быть довольно сложным для понимания среди новичков, и овладение навыками правильного использования указателей может занять некоторое время[100].
Go и Python — кардинально различающиеся языки, тем не менее, они часто сравниваются один с другим из-за общей ниши — бэкэнда веб-приложений. По выражению Джейсона Кинкэйда, Go объединяет «производительность и безопасность компилируемых языков, таких как C++, со скоростью разработки на динамических языках, таких как Python»[105]. В какой-то мере это действительно так: Go изначально разработан как строго статически типизированный компилируемый язык, поддерживающий максимум возможностей динамических языков, при котором ещё можно обеспечить эффективную компиляцию и сохранить производительность компилируемых программ.Общими для обоих языков является использование автоматического управления памятью, наличие встроенных динамических коллекций (массивов и словарей), поддержка срезов, развитый механизм модулей, простой и минималистичный синтаксис. Различий гораздо больше, и не всегда можно однозначно указать, в пользу какого из языков они говорят.
- Динамические возможности.
- Если Python является полностью динамическим языком и практически любые элементы программы могут меняться во время исполнения, включая конструирование «на лету» новых типов и модификацию существующих, то Go — статический язык с достаточно ограниченными возможностями рефлексии, работающей только в отношении созданных при разработке типов данных. В некоторой мере заменой динамических возможностей в Go является кодогенерация, обеспечиваемая простотой синтаксиса и наличием необходимых инструментов и системных библиотек. Также в Go 1.18 добавили поддержку средств обобщённого программирования (generics)[106].
Оба языка являются интерпретируемыми, компилируются в промежуточное представление, которое затем отправляется на исполнение. В случае Python генерируется промежуточный байт-код, а компилятор Perl генерирует синтаксическое дерево. Управление памятью в обоих языках автоматическое, а сами языки используются как скриптовые и хорошо подходят для написания веб-приложений. Подход в написания кода Python предполагает лучшее пониманиелистинга программы в ущерб производительности, тогда как в Perl больше свободы в синтаксисе, что может привести к тому, что программы на Perl становятся нечитабельны для программистов, не работающих с данным языком[100].
Python, MATLAB и R используются в обработке данных и в обучении студентов основам математики и статистики. R является языком для выполнения статистических расчётов, в то время как MATLAB может считаться языком программирования наряду с Python[107].
Языки, на которые повлиял Python
[править |править код]Python, как весьма популярный язык программирования, повлиял на следующие языки:
- CoffeeScript имеет синтаксис, вдохновлённый Python[108].
- ECMAScript/JavaScript заимствовал итераторы и генераторы из Python[109].
- Go, при сильнейших идеологических различиях, заимствовал у динамических языков, таких как Python, встроенные словари, динамические массивы, срезы.
- Groovy был создан с мотивацией привнести философию Python наJava[110].
- Julia была задумана как «такая же пригодная для общего программирования, как и Python»[111].
- Nim использует систему отступов и аналогичный синтаксис[112].
- Ruby —Юкихиро Мацумото, создатель языка, сказал: «Я хотел скриптовый язык, который был бы более мощным, чем Perl, и более объектно-ориентированным, чем Python. Вот почему я решил создать свой собственный язык»[113].
- Swift во время разработки брал идеи структуры языка из Python, а также изObjective-C,Rust,Haskell,Ruby,C#,CLU[114].
Критика
[править |править код]Низкое быстродействие
[править |править код]Классический Python имеет общий со многими другимиинтерпретируемыми языками недостаток — сравнительно невысокую скорость выполнения программ[115]. В некоторой степени ситуацию улучшает кешированиебайт-кода (расширения.pyc и, до версии 3.5,.pyo), которое позволяет интерпретатору не тратить время на синтаксический разбор текста модулей при каждом запуске.
Существуют реализации языка Python, вводящие высокопроизводительныевиртуальные машины в качестве бэкенда компилятора. Примерами таких реализаций может служитьPyPy, базирующийся на RPython, более ранней инициативой является проектParrot. Ожидается, что использование виртуальной машины типаLLVM приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где низкая вычислительная производительность в основном преодолена[116]. Однако нельзя забывать, что динамический характер Python делает неизбежными дополнительные накладные расходы при исполнении программ, что ограничивает производительность Python-систем независимо от применяемых технологий. Вследствие этого для написания критических участков кода используются низкоуровневые языки, интеграция с которыми обеспечивается множеством программ и библиотек.
Тем не менее, Python портирован на некоторые относительно малопроизводительные платформы[117].
Глобальная блокировка интерпретатора (GIL)
[править |править код]
Интерпретатор Python вCPython (а такжеStackless иPyPy[118]) использует потоко-небезопасные данные, во избежание разрушения которых при совместной модификации из разных потоков применяется глобальная блокировка интерпретатора — GIL (Global Interpreter Lock)[119]: в ходе исполнения кода поток интерпретатора блокирует GIL, выполняет в течение фиксированного времени (по умолчанию 5 миллисекунд[К 2]) некоторое количество инструкций, после чего освобождает блокировку и приостанавливается, давая возможность работать другим потокам. GIL также освобождается во время ввода-вывода, изменения и проверки состояния синхронизирующих примитивов, при исполнении кода расширений, не обращающихся к данным интерпретатора, например,NumPy/SciPy. Таким образом, в каждый момент времени в одном процессе интерпретатора Python может исполняться только один поток кода на Python, независимо от числа доступных процессорных ядер.
Потери производительности от GIL зависят от характера программ и архитектуры системы. Большинство программ является однопоточными либо запускает всего несколько потоков, из которых часть в каждый конкретный момент простаивает в ожидании. Персональные компьютеры обычно имеют небольшое количество процессорных ядер, которые загружены параллельно исполняющимися в системе процессами, так что реальные потери производительности на персональных компьютерах из-за GIL невелики. Но в серверных приложениях может быть удобно использовать десятки и сотни (а то и больше) параллельных потоков (например, в системах массового обслуживания, где каждый поток обрабатывает данные для отдельного пользовательского запроса), а серверы на конец 2010-х годов нередко имеют десятки и даже сотни процессорных ядер, то есть технически могут обеспечить этим потокам физически одновременное исполнение; в таких условиях GIL может приводить к действительно значительному снижению общей производительности, так как лишает программу возможности полноценно использовать ресурсы многоядерных систем.
Гвидо ван Россум говорил, что GIL «не так уж и плох» и он будет в CPython до тех пор, пока «кто-то другой» не представит реализацию Python без GIL, с которой бы однопоточные скрипты работали так же быстро[122][123].
В задачи разработки входит работа по оптимизации GIL[124]. Планируется отказ от GIL, есть черновой вариант PEP 703[125], но на данный момент есть следующие варианты избавления от GIL:
- Вариант интерпретатора с синхронизацией доступа к отдельным объектам вместо глобальной блокировки[126] из-за частых захватов/освобождений блокировок оказался слишком медленным.
- Реализация потоков через процессы ОС, например, модуль multiprocessing[127].
- Отказ от совместного использования изменяемых данных и вызовов внешнего кода. При этом данные дублируются в потоках и их синхронизация (если таковая нужна) лежит на программисте[128].
- Библиотеки, обеспечивающие собственную организацию поддержки потоков.
- Есть черновой PEP по отказу от GIL в CPython[125]
9 января 2023 года был принят PEP 703, в котором было предложено сделать GIL опциональным[125]. В Python 3.13, выход которого запланирован на октябрь 2024 года, добавлена экспериментальная опция для отключения GIL на этапе сборки интерпретатора[129]. В ближайшие несколько релизов будут формироваться две сборки интерпретатора Python — с включённым и отключённым GIL (с несовместимымиABI), но в будущем планируется добавить возможность отключать GIL на этапе выполнения[125].
Синтаксис и семантика
[править |править код]Несмотря на то, что одним из заявленных принципов дизайна Python являетсяпринцип наименьшего удивления, критики отмечают целый ряд архитектурных решений, которые могут вводить в заблуждение или вызывать недоумение у программистов, привыкших к другим распространённым языкам[130]. В их числе:
- Отличие в принципе работы оператора присвоения по сравнению со статически-типизированными языками. В Python при присвоении значения копируется ссылка на объект, а не значение. При работе с простыми неизменяемыми типами возникает ощущение изменения значения переменной при присваивании ей значения, однако фактически присваивается ссылка на другое значение, например, при увеличении значения переменной типа
intна 1 меняется ссылка, а не увеличивается значение по ссылке. Однако при работе с изменяемыми типами их содержимое можно менять по ссылке, поэтому при присвоении одной переменной ссылки на другую и последующем изменении значения в одной из двух переменных оно изменится в обеих переменных, что хорошо заметно при работе со списками[130][131]. При этом кортежи хоть и являются неизменяемыми, но могут хранить ссылки на изменяемые объекты, поэтому по факту кортежи тоже можно менять[132]; - Отличие в поведении на некоторых типах «сокращённых» операторов, таких как
+=и их развёрнутой записи, хотя в большинстве языков «сокращённый» вариант — это просто краткая запись полного, и семантически они абсолютно эквивалентны. Пример с использованиемx +=:Аналогичный пример с использованием>>>x=[1,2]>>>y=x>>>x+=[3,4]>>>x[1,2,3,4]>>>y[1,2,3,4]
x = x +:>>>x=[1,2]>>>y=x>>>x=x+[3,4]>>>x[1,2,3,4]>>>y[1,2]
- Жёсткая трактовка лексической области видимости, подобная используемой в #"ltr">
classColored:color="red"obj1=Colored()print(obj1.color)# выводится исходное значение поля КЛАССАColored.color="green"# изменение поля КЛАССАprint(obj1.color)# выводится значение поля КЛАССАobj1.color="blue"# изменяется поле ОБЪЕКТА и фиксируется его значениеColored.color="yellow"# изменение поля КЛАССА, которое уже не отразится на объектеprint(obj1.color)# выводится поле ОБЪЕКТА# Скрипт выведет:redgreenblue
- В примере выше три раза выводится поле color объекта obj1 класса Colored. При этом пока не выполнена запись в это поле, выводится текущее значениеполя класса, и в третий раз — значение поля объекта. Такое сохранение связи между полем объекта и класса до первой перезаписи может стать причиной неожиданного эффекта: если в программе меняется значение поля класса, то все объекты, одноимённые поля которых ещё не перезаписаны, окажутся неявно изменены.
- Интуитивно трудно предсказуемое поведение параметров со значением-объектом по умолчанию. Если в качестве инициализатора для параметра по умолчанию указать конструктор объекта, это приведёт к созданию статического объекта, ссылка на который и будет передаваться по умолчанию в каждый вызов[133]. Это может повлечь трудно уловимые ошибки.
Невозможность модификации встроенных классов
[править |править код]По сравнению сRuby и некоторыми другими языками, в Python отсутствует возможность модифицировать встроенные классы[134], такие, какint, str, float, list и другие.
Реализации
[править |править код]CPython
[править |править код]CPython является основной реализацией языка. Он написан наязыке Си и является переносимым на разные платформы. В основе управления памятью лежит использование комбинации счётчиков ссылок и сборщика мусора, ответственного за поиск циклических захватов ссылок[29]. Хотя язык считается интерпретируемым, на самом деле он компилируется в промежуточный высокоуровневый байт-код[135][136], который затем исполняется через стековую виртуальную машину[29]. Например, вызов функцииprint() может быть представлен в следующем виде[136]:
00RESUME012PUSH_NULL4LOAD_NAME0(print)6LOAD_CONST0('HelloWorld!')8PRECALL112CALL122RETURN_VALUE
Имена в языке имеют позднее связывание, в результате чего можно писать обращения к переменным, методам и атрибутам, которых ещё нет, но они должны быть объявлены на момент исполнения кода, использующего их. Каждый объект в Python имеет словарь, представленный хеш-таблицей, через который происходит сопоставление названий атрибутов их значениям. Глобальные переменные также сопоставляются через словарь. Одно обращение к методу или атрибуту может сопровождаться поочерёдным поиском в нескольких словарях[29].
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[137].
Другие реализации
[править |править код]Существуют также другие реализации.
- Numba[англ.] — Jit-компилятор на основе LLVM с поддержкой NumPy.
- PyS60[138] — реализация языка длясмартфонов фирмыNokia на платформеSeries 60. Не поддерживается
- IronPython — Python для.NET Framework иMono. Компилирует Python программы вMSIL, таким образом предоставляя полную интеграцию с .NET-системой[139].
- Stackless — также написанная на Си реализация Python. Это не полноценная реализация, апатчи к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубинурекурсии.
- Python for .NET[140] — ещё одна реализация Python для .NET. В отличие от IronPython эта реализация не компилирует Python код в MSIL, а только предоставляет интерпретатор, написанный наC#. Позволяет использовать .NET-сборки из Python кода.
- Jython — реализация Python, использующаяJVM в качестве среды исполнения. Позволяет прозрачно использоватьJava-библиотеки.
- TinyPy[141] — минималистическая версия Python. Часть возможностей CPython не реализована.
- MicroPython — реализация Python 3 для встроенных систем с малым объёмом оперативной памяти[142].
- Brython[143] — реализация языка на клиентском JavaScript, позволяющая писать браузерные скрипты на Python 3.
- QPython[144] — реализация Python для Android. Проект всё ещё на стадии тестирования, однако на QPython уже портированы некоторые самые необходимые библиотеки. Позволяет и работать в интерактивном режиме. Существует также Qpython3.
Специализированные подмножества/расширения Python
[править |править код]На основе Python было создано несколько специализированных подмножеств языка, в основном предназначенных для статической компиляции в машинный код. Некоторые из них перечислены ниже.
- RPython[145] — созданная в рамках проектаPyPy сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. Код на RPython можно компилировать во множество других языков/платформ — C, JavaScript, Lisp, .NET[146],LLVM. На RPython написан интерпретатор PyPy.
- Cython[147] — ограниченная реализация Python, но несколько меньше, чем RPython.Cython расширен возможностями статической типизации типами из языка C и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений, компилируется в код на языке C.
- Nuitka[148] — позволяет транслировать весь код Python в кодСи или в исполняемые файлы.
Инструменты поддержки программирования
[править |править код]Интерактивный режим
[править |править код]ПодобноLisp иProlog, Python может использоваться в интерактивном режиме, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран (REPL). Этот режим удобен как при изучении языка, так и в процессе профессиональной разработки — для быстрого тестирования отдельных фрагментов кода, — так как обеспечивает немедленную обратную связь. Также он позволяет использовать интерпретатор в качествекалькулятора с большим набором функций.
- Эталонная реализация Python имеет встроенный интерактивный интерпретатор, работающий в режиме текстового терминала и позволяющий выполнять все основные операции. В интерактивном режиме доступенотладчик
pdbи система помощи (вызывается поhelp()), работающая для всех модулей, классов и функций, которые содержат строки документации:
>>>frommathimport*# импорт математических функций>>>help(cos)# помощь по функции cosHelponbuilt-infunctioncosinmodulemath:cos(x,/)Returnthecosineofx(measuredinradians).
- IPython[149] — выходящая подBSD-лицензией кросс-платформенная интерактивная оболочка, предоставляющая расширенную интроспекцию и дополнительные команды. В частности, позволяет передавать исполняемому коду на Python результаты выполнения команд системной командной оболочки. Поддерживает подсветку кода и автоматическое дополнение.
- BPython[150] — расширение стандартной командной оболочки 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 — IDE с открытым исходным кодом для Python подлицензией MIT, бесплатная, доступна на платформах Windows, Mac OS X и Linux. Особенностью является то, что IDE ориентирована наdata science, в ней удобно работать с библиотеками типа SciPy, NumPy, Matplotlib. Spyder поставляется в комплекте с менеджером пакетовAnaconda. В целом обладает качествами стандартной IDE, имеет редактор с подсветкой синтаксиса, автоматическое дополнение кода, обозреватель документации.
- Thonny — многоплатформенная бесплатная IDE, выпускается подлицензией MIT, поддерживается Институтом информатикиТартуского университета вЭстонии. Позиционируется как «Python IDE для новичков», полностью, включая интерпретатор Python, ставится «из коробки» пользователем без административных прав, сразу после установки может использоваться без дополнительных настроек. Предназначена для обучения, имеет улучшенную визуализацию порядка вычисления выражений и вызова функций, динамическую подсветку синтаксических ошибок, простой менеджер пакетов. Для профессионального применения возможностей недостаточно, например, нет поддержки проектов и интеграции ссистемами управления версиями.
- IDLE[151] — встроенный в Python IDE. Очень простой и малофункциональный.
Помимо этого, существуют плагины для поддержки программирования на Python для универсальных IDEEclipse[152],KDevelop[153],Visual Studio Code[154] иMicrosoft Visual Studio[155], а также имеется поддержка подсветки синтаксиса, авто дополнения кода и подключения средств отладки и запуска приложений для целого ряда распространённых текстовых редакторов.
Применение
[править |править код]
Python — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. На Python реализовано большое количество проектов, также он активно используется для создания прототипов будущих программ.
Python является лёгким в изучении языком, и часто изучается как первый язык[1], в том числе используется при обучении детей программированию[156]. Как первый язык он хорошо подходит, поскольку программы на нём близки к естественному языку, на котором люди привыкли думать, а для написания корректной программы требуется минимальное количество ключевых слов. В других же языках, таких какC++, существует большое количество различных синтаксических конструкций и элементов языка, которым приходится уделять внимание вместо изучения алгоритмов[101].
Являясь приложением с открытым исходным кодом, интерпретатор Python используется по всему миру и поставляется в составе операционных систем на базе Linux, а также в компьютерах от фирмыApple. Python популярен среди индивидуальных разработчиков, но также используется крупными компаниями в достаточно серьёзных продуктах, ориентированных на получение прибыли[157]. На Python написанReddit[38] и YouTube[158]. ВDropbox[159] также активно применяется Python, а из-за сложностей динамической типизации и огромного количества кода компания перешла к статической типизации с помощью открытого проекта Mypy[160] Также Python активно используется вFacebook[161] иInstagram[162]. Многие компании используют Python для тестирования аппаратного обеспечения, среди этих компаний значатсяIntel,Cisco,Hewlett-Packard иIBM.Industrial Light & Magic иPixar используют его при создании анимационных фильмов[157].
Язык активно используется компаниейGoogle в её поисковой системе, аYouTube в значительной степени написан с использованием Python[157][163]. Кроме того, Google спонсирует разработку Python с 2010 года[164][165], и поддержкуPyPI, основной системы распространения пакетов для Python[164][166].
Сильными сторонами Python являются его модульность и возможность интегрироваться с другими языками программирования, в том числе в составе сложных комплексных приложений и систем[167]. Многие проекты предоставляют прикладной интерфейс программирования на Python для написания скриптов, например, среды 3D-моделированияAutodesk Maya[157],Blender[168] иHoudini[169], а также свободная геоинформационная системаQGIS[170].Агентство национальной безопасности США использует Python для анализа данных, аNASA использует его при выполнении научных задач[157]. Из инструментов, используемых в NASA, можно отметить свободный графический симулятор сетиGNS3[англ.], который также хорошо зарекомендовал себя в корпоративной среде и используется в технологических компаниях, например, вIntel[171]. На Python написана также свободная популярная программа нарезки 3D моделей для печати на 3D-принтерахCura[172][173].
Python с пакетамиNumPy,SciPy иMatPlotLib активно используется как универсальная среда для научных расчётов в качестве замены распространённым специализированным коммерческим пакетам, таким какMatlab, предоставляя аналогичную функциональность и более низкий порог вхождения[174].
Обладая обилием тематических инструментов и удобством для работы с большими данными, Python является лучшим языком программирования по использованию в ИИ-сфере и машинном обучении.[175]
Интерпретатор Python может использоваться в качестве мощной командной оболочки и скриптового языка для написания командных файлов ОС. Лёгкость обращения из Python-скриптов к внешним программам и наличие библиотек, дающих доступ к управлению системой, делают Python удобным инструментом для системного администрирования[176]. Он широко используется для этой цели на платформе Linux: обычно Python поставляется с системой, во многих дистрибутивах инсталляторы и визуальный интерфейс системных утилит написаны именно на Python. Используется он и в администрировании других Unix-систем, в частности, вSolaris иmacOS[176].Кроссплатформенность самого языка и библиотек делает его привлекательным для унифицированной автоматизации задач системного администрирования в гетерогенных средах, где совместно применяются компьютеры с операционными системами различных типов.
Будучи языком общего назначения, Python применим почти во всех сферах деятельности. Фактически Python используется практически любой солидной компанией тем или иным образом как для выполнения текущих задач, так и в тестировании, администрировании или в разработке программных продуктов[157]. Наибольшую популярность язык сыскал среди учёных по данных и инженеров в сфере машинного и глубокого обучения[177][178].
Примечания
[править |править код]Комментарии
[править |править код]Источники
[править |править код]- ↑12345678Yogesh Rana. Python: Simple though an Important Programming language (англ.) // International Research Journal of Engineering and Technology (IRJET). — 2019. — 2 February (vol. 06,iss. 2). —P. 1856—1858. —ISSN2395-0056. Архивировано 11 февраля 2021 года.
- ↑12345Satwik Kansal. Metaprogramming in Python (англ.). IBM (5 апреля 2018). Дата обращения: 14 апреля 2021. Архивировано 27 февраля 2021 года.
- ↑12345asyncio — Asynchronous I/O . Python documentation. Дата обращения: 9 октября 2023. Архивировано 5 мая 2019 года.
- ↑Python 3.14.3 and 3.13.12 are now available! — 2026.
- ↑123History and License - Python documentation
- ↑Why was Python created in the first place? —Python Software Foundation.
- ↑Download Python
- ↑Мария «Mifrill» Нефёдова, Создатели языков программирования: Они такие разные, но кодинг их объединяет, Хакер № 09/08 (117) (рус.). Дата обращения: 1 декабря 2012. Архивировано изоригинала 2 июля 2013 года.
- ↑Прохоренок Н., Дронов В. Введение // Python 3. Самое необходимое, 2-е изд.. — БХВ-Петербург, 2019. — С. 11. — 608 с. —ISBN 9785977539944. — [Архивировано 12 февраля 2021 года.]
- ↑1234Robert Dyer.An exploratory study on the predominant programming paradigms in Python code : [англ.] / Robert Dyer, Jigyasa Chauhan. — 2022,9 November. —doi:10.1145/3540250.3549158. —WD Q130894527.
- ↑Juan Alejandro Oliva Trejo.Basic Uses of Python for Research in Our Laboratory: Examples of Data Analysis, and Processing of Histological Samples Based on the Special Graduate Lecture for Postgraduate Students Presented on January 2025 : [англ.] // Juntendo Medical Journal[d]. — 2025,31 July. — Vol. 71, iss. 4. — P. 231—237. —ISSN 0022-6769,2188-2134,2187-9737,2188-2126. —doi:10.14789/ejmj.jmj25-0015-r. —PMID 40969818. —WD Q136827049.
- ↑SkipMontanaro. Why is Python a dynamic language and also a strongly typed language - Python Wiki (англ.). wiki.python.org (24 февраля 2012). Дата обращения: 14 марта 2021. Архивировано 14 марта 2021 года.
- ↑1234Mark Lutz. A Python Q&A Session (англ.). Learning Python, 3rd Edition [Book]. O'Reilly Media, Inc. (2007). Дата обращения: 11 февраля 2021. Архивировано 8 февраля 2021 года.
- ↑Space Telecommunications Interface (STI) PSM – Annex A : [англ.] : [арх. 30 мая 2025] // Space Telecommunications Interface (STRS). — Дата обращения: 13 ноября 2025.
- ↑Python Introduction | (англ.). Python Education. Google Developers (20 августа 2018). Дата обращения: 21 февраля 2021. Архивировано 4 декабря 2020 года.
- ↑Sudhanshu Chauhan.Hacking Web Intelligence: Open Source Intelligence and Web Reconnaissance Concepts and Techniques : [англ.] / Sudhanshu Chauhan, Nutan Kumar Panda. — Syngress, 2015,13 April. — P. 229. —ISBN 978-0-12-801912-2.
- ↑Robert Sedgewick.Introduction to Programming in Python: An Interdisciplinary Approach : [англ.] / Robert Sedgewick, Kevin Wayne, Robert Dondero. — Addison-Wesley Professional, 2015,27 May. — 1487 p. —ISBN 978-0-13-407652-2.
- ↑Subburaj Ramasamy.Mastering Python 3 Programming: Ultimate guide to learn Python coding fundamentals and real-world applications (English Edition) : [англ.]. — BPB Publications, 2024,14 May. — 769 p. —ISBN 978-93-5551-712-8.
- ↑12Alexandre Bergel, Lorenzo Bettini. Generic Programming in Pharo (англ.) // Software and Data Technologies / José Cordeiro, Slimane Hammoudi, Marten van Sinderen. — Berlin, Heidelberg: Springer, 2013. —P. 66–79. —ISBN 978-3-642-45404-2. —doi:10.1007/978-3-642-45404-2_5. Архивировано 13 февраля 2021 года.
- ↑12R. Peschke, K. Nishimura, G. Varner. ARGG-HDL: A High Level Python BasedObject-Oriented HDL Framework (англ.) // IEEE Transactions on Nuclear Science : pre-print. — 2020. — October. —arXiv:011.02626v1. Архивировано 7 ноября 2020 года.
- ↑12Steven F. Lott. Aspect-oriented programming (англ.). Mastering Object-Oriented Python - Second Edition. Packt Publishing (2019). Дата обращения: 21 февраля 2021. Архивировано 21 февраля 2021 года.
- ↑Arne Bachmann, Henning Bergmeyer, Andreas Schreiber. Evaluation of aspect-oriented frameworks in Python for extending a project with provenance documentation features (англ.) // The Python Papers. — 2011. —Vol. 6,iss. 3. —P. 1–18. —ISSN1834-3147. Архивировано 22 апреля 2018 года.
- ↑Steven Cooper. Data Science from Scratch: The #1 Data Science Guide for Everything A Data Scientist Needs to Know: Python, Linear Algebra, Statistics, Coding, Applications, Neural Networks, and Decision Trees (англ.). — Roland Bind, 2018. — 126 p. — [Архивировано 21 февраля 2021 года.]
- ↑Reuven M. Lerner. Multiprocessing in Python (англ.). Linux Journal (16 апреля 2018). Дата обращения: 14 февраля 2021. Архивировано 14 февраля 2021 года.
- ↑David Beazley, Brian K. Jones. 10. Modules and Packages - Python Cookbook, 3rd Edition [Book] (англ.). Python Cookbook, 3rd Edition. O'Reilly Media, Inc. (2013). Дата обращения: 21 февраля 2021. Архивировано 21 февраля 2021 года.
- ↑About Python (англ.). Дата обращения: 7 августа 2007. Архивировано 11 августа 2007 года.
- ↑PythonImplementations - Python Wiki (англ.). wiki.python.org (21 июля 2020). Дата обращения: 17 февраля 2021. Архивировано 11 ноября 2020 года.
- ↑History and License (англ.). Python. Дата обращения: 21 мая 2021. Архивировано 5 декабря 2016 года.
- ↑1234Mostafa Chandra Krintz, C. Cascaval, D. Edelsohn, P. Nagpurkar, P. Wu. Understanding the Potential of Interpreter-based Optimizations for Python (англ.) // UCSB Technical Report. — 2010. — 11 August. Архивировано 23 февраля 2021 года.
- ↑Alex Martelli.Python in a Nutshell: A Desktop Quick Reference : [англ.] / Alex Martelli, Anna Ravenscroft, Steve Holden. — O'Reilly Media, Inc., 2017,7 April. — 752 p. —ISBN 978-1-4919-1385-7.
- ↑123J. Akeret, L. Gamper, A. Amara, A. Refregier. HOPE: A Python just-in-time compiler for astrophysical computations (англ.) // Astronomy and Computing. — 2015. — 1 April (vol. 10). —P. 1–8. —ISSN2213-1337. —doi:10.1016/j.ascom.2014.12.001. —arXiv:1410.4345v2. Архивировано 15 февраля 2021 года.
- ↑12PEP 373 -- Python 2.7 Release Schedule (англ.) (23 марта 2014). Дата обращения: 7 марта 2021. Архивировано 25 февраля 2021 года.
- ↑1234Berk Ekmekci, Charles E. McAnany, Cameron Mura. An Introduction to Programming for Bioscientists: A Python-Based Primer (англ.) // PLOS Computational Biology. — 2016. — 6 July (vol. 12,iss. 6). —P. e1004867. —ISSN1553-7358. —doi:10.1371/journal.pcbi.1004867. —PMID27271528. Архивировано 16 февраля 2021 года.
- ↑Pankajeshwara Nand Sharma.Unearthing open source decision‐making processes: A case study of python enhancement proposals : [англ.] / Pankajeshwara Nand Sharma, Bastin Tony Roy Savarimuthu, Nigel Stanger // Automatic generation of make dependencies[d]. — 2022,12 August. — Vol. 52, iss. 10. — P. 2312—2346. —doi:10.1002/spe.3128. —OCLC 5156767193. —WD Q134596841.
- ↑12Ethan Bommarito, Michael James Bommarito. An Empirical Analysis of the Python Package Index (PyPI) (англ.) // Social Science Research Network. — Rochester, NY: Social Science Research Network, 2019. — 25 July. —ISSN1556-5068. —doi:10.2139/ssrn.3426281. —arXiv:arXiv:1907.11073v2. Архивировано 9 июня 2021 года.
- ↑Pratik Desai. Python Programming for Arduino (англ.). — Packt Publishing Ltd, 2015. — P. 8. — 400 p. —ISBN 978-1-78328-594-5. — [Архивировано 21 февраля 2021 года.]
- ↑12Sebastian Bassi. A Primer on Python for Life Science Researchers (англ.) // PLOS Computational Biology. — 2007. — 30 November (vol. 3,iss. 11). —P. e199. —ISSN1553-7358. —doi:10.1371/journal.pcbi.0030199. Архивировано 13 марта 2021 года.
- ↑12Kalyani Adawadkar. Python Programming - Applications and Future (англ.) // International Journal of Advance Engineering and Research Development. — 2017. — April (iss. SIEICON-2017). —P. 1—4. —ISSN2348-447. Архивировано 15 июля 2020 года.
- ↑Архивированная копия . Дата обращения: 1 июня 2009. Архивировано изоригинала 17 февраля 2016 года.
- ↑12General Python FAQ . Python v2.7.3 documentation. Docs.python.org. Дата обращения: 4 июня 2020. Архивировано 24 октября 2012 года.
- ↑Index of Python Enhancement Proposals (PEPs) . Дата обращения: 28 января 2007. Архивировано 28 января 2007 года.
- ↑Python 3.0 Release . Дата обращения: 1 июня 2009. Архивировано 2 июня 2009 года.
- ↑PEP 373 -- Python 2.7 Release Schedule . python.org. Дата обращения: 9 января 2017. Архивировано 19 мая 2020 года.
- ↑PEP 466 -- Network Security Enhancements for Python 2.7.x . python.org. Дата обращения: 9 января 2017. Архивировано 4 июня 2020 года.
- ↑Sunsetting Python 2 (англ.). Python.org. Дата обращения: 22 сентября 2019. Архивировано 12 января 2020 года.
- ↑Python Developer's Guide — Python Developer's Guide . devguide.python.org. Дата обращения: 17 декабря 2019. Архивировано 9 ноября 2020 года.
- ↑Extending and Embedding the Python Interpreter: Reference Counts (англ.). Docs.python.org. — «Since Python makes heavy use of
malloc()andfree(), it needs a strategy to avoid memory leaks as well as the use of freed memory. The chosen method is calledreference counting.» Дата обращения: 5 июня 2020. Архивировано 18 октября 2012 года. - ↑What’s New In Python 3.0 — Python 3.12.0 documentation . Дата обращения: 8 октября 2023. Архивировано 2 ноября 2012 года.
- ↑Hettinger, Raymond. PEP 289 – Generator Expressions . Python Enhancement Proposals. Python Software Foundation (30 января 2002). Дата обращения: 19 февраля 2012. Архивировано 14 июня 2020 года.
- ↑6.5 itertools – Functions creating iterators for efficient looping . Docs.python.org. Дата обращения: 22 ноября 2016. Архивировано 14 июня 2020 года.
- ↑PEP 20 — The Zen of Python . Дата обращения: 23 сентября 2005. Архивировано 17 июля 2005 года.
- ↑Бейдер Дэн. Чистый Python. Тонкости программирования для профи. — "Издательский дом ""Питер""", 2018. — С. 64—65. — 288 с. —ISBN 978-5-4461-0803-9. — [Архивировано 10 апреля 2021 года.]
- ↑Venners, Bill. The Making of Python . Artima Developer. Artima (13 января 2003). Дата обращения: 22 марта 2007. Архивировано 1 сентября 2016 года.
- ↑Peters, Tim. PEP 20 – The Zen of Python . Python Enhancement Proposals. Python Software Foundation (19 августа 2004). Дата обращения: 24 ноября 2008. Архивировано 26 декабря 2018 года.
- ↑Alex Martelli, Anna Ravenscroft, David Ascher. Python Cookbook, 2nd Edition. —O'Reilly Media, 2005. — P. 230. —ISBN 978-0-596-00797-3.Архивная копия от 23 февраля 2020 наWayback MachineИсточник . Дата обращения: 28 декабря 2020. Архивировано 23 февраля 2020 года.
- ↑Python Culture . ebeab (21 января 2014). Архивировано изоригинала 30 января 2014 года.
- ↑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. — [Архивировано 9 июня 2021 года.]
- ↑15 Ways Python Is a Powerful Force on the Web . Дата обращения: 28 декабря 2020. Архивировано изоригинала 11 мая 2019 года.
- ↑8.18. pprint — Data pretty printer — Python 3.8.3 documentation . docs.python.org. Дата обращения: 28 декабря 2020. Архивировано 22 января 2021 года.
- ↑Python on Android (англ.). www.damonkohler.com. Дата обращения: 19 декабря 2009. Архивировано 28 января 2011 года.
- ↑Port-Specific Changes: Windows (англ.). Python v2.6.1 documentation. What’s New in Python 2.6. Python Software Foundation. Дата обращения: 11 декабря 2008. Архивировано 28 января 2011 года.
- ↑3. Using Python on Windows — Python 3.5.9 documentation (англ.). Python Documentation. Python Software Foundation. Дата обращения: 8 июня 2020. Архивировано 15 октября 2020 года.
- ↑Drop support of Windows Vista and 7 in Python 3.9 (англ.). Дата обращения: 10 января 2021. Архивировано 4 ноября 2020 года.
- ↑PEP 484 — Type Hints : [англ.] // Python Enhancement Proposals. — Дата обращения: 9 октября 2023.
- ↑Luciano Ramalho.Fluent Python : [англ.]. — O'Reilly Media, Inc., 2022,31 March. — P. 253. —ISBN 978-1-4920-5630-0.
- ↑12Рамальо, 2016, p. 61.
- ↑15. Floating Point Arithmetic: Issues and Limitations — Python 3.8.3 documentation . docs.python.org. — «Almost all machines today (November 2000) use IEEE-754 floating point arithmetic, and almost all platforms map Python floats to IEEE-754 “double precision”.» Дата обращения: 6 июня 2020. Архивировано 6 июня 2020 года.
- ↑Moshe Zadka, Guido van Rossum. PEP 237 – Unifying Long Integers and Integers . Python Enhancement Proposals. Python Software Foundation (11 марта 2001). Дата обращения: 24 сентября 2011. Архивировано 28 мая 2020 года.
- ↑Built-in Types . Дата обращения: 3 октября 2019. Архивировано 14 июня 2020 года.
- ↑12Рамальо, 2016, pp. 52—54.
- ↑Foreword for «Programming Python» (1st ed.) (англ.). Дата обращения: 7 марта 2021. Архивировано 20 января 2021 года.
- ↑2.3.2. Reserved classes of identifiers . Python documentation (18 октября 2009). Архивировано 28 января 2011 года.
- ↑…целостность больших проектов на Python строится на двух вещах: тесты и doc-строка . Дата обращения: 31 октября 2008. Архивировано 21 октября 2008 года.
- ↑Steve D. Jost. Structured Programming Details (англ.). Университет Де Поля (2019). Дата обращения: 17 февраля 2021. Архивировано 29 апреля 2020 года.
- ↑PyDBC: method preconditions, method postconditions and class invariants for Python . Дата обращения: 24 сентября 2011. Архивировано 23 ноября 2019 года.
- ↑Contracts for Python . Дата обращения: 24 сентября 2011. Архивировано 15 июня 2020 года.
- ↑PyDatalog . Дата обращения: 22 июля 2012. Архивировано 13 июня 2020 года.
- ↑123Object-oriented programming in Python (англ.). IBM Developer. ibm.com (20 октября 2020). Дата обращения: 11 марта 2021. Архивировано 11 марта 2021 года.
- ↑1239. Classes (англ.). Python 3.9.2 documentation. docs.python.org. Дата обращения: 14 марта 2021. Архивировано 14 марта 2021 года.
- ↑Fawzi Albalooshi, Amjad Mahmood. A Comparative Study on the Effect of Multiple Inheritance Mechanism in Java, C++, and Python on Complexity and Reusability of Code (англ.) // International Journal of Advanced Computer Science and Applications (IJACSA). — 2017. —Vol. 8,iss. 6. —ISSN2156-5570. —doi:10.14569/IJACSA.2017.080614. Архивировано 10 июля 2020 года.
- ↑Michele Simionato. The Python 2.3 Method Resolution Order (англ.). Python.org. Дата обращения: 14 марта 2021. Архивировано 14 марта 2021 года.
- ↑PEP 484 -- Type Hints (англ.). Python.org (24 сентября 2014). Дата обращения: 13 февраля 2021. Архивировано 9 февраля 2021 года.
- ↑Jukka Lehtosalo. Generics (англ.). Mypy 0.800 documentation. Read the Docs (2016). Дата обращения: 13 февраля 2021. Архивировано 13 февраля 2021 года.
- ↑12Рамальо, 2016, pp. 188—191.
- ↑12David Mertz. Functional Programming in Python (англ.). — O'Reilly, 2015. —ISBN 978-1491928561.
- ↑Рамальо, 2016, p. 273.
- ↑Рамальо, 2016, pp. 613—708.
- ↑Патрик О'Брайен. Руководство по интроспекции на Python /Intersoft Lab. Архивировано 21 июля 2021 года.
- ↑Beazley, 2009, pp. 222—225.
- ↑123Рамальо, 2016, pp. 214—246.
- ↑Рамальо, 2016, pp. 686—688.
- ↑6.2. re — Regular expression operations — Python 3.5.1 documentation . Дата обращения: 11 мая 2016. Архивировано 18 июля 2018 года.
- ↑A.M. Kuchling (14 июля 2000).PEP 206 -- Python Advanced Library.Python.org.Архивировано 5 мая 2021. Дата обращения: 4 апреля 2021.
- ↑The Python Standard Library . Python documentation. Дата обращения: 9 октября 2023. Архивировано 6 июня 2023 года.
- ↑PyPI · Индекс пакета Python (рус.). PyPI. Дата обращения: 9 октября 2023. Архивировано 3 июня 2017 года.
- ↑123PythonSpeed/PerformanceTips - Python Wiki . wiki.python.org. Дата обращения: 9 октября 2023. Архивировано 18 октября 2023 года.
- ↑PyChecker: a python source code checking tool . Дата обращения: 3 февраля 2007. Архивировано 2 февраля 2007 года.
- ↑pylint (analyzes Python source code looking for bugs and signs of poor quality.) (Logilab.org) . Дата обращения: 3 февраля 2007. Архивировано 12 февраля 2007 года.
- ↑Pylint 3.0.1 documentation . pylint.readthedocs.io. Дата обращения: 9 октября 2023. Архивировано 18 октября 2023 года.
- ↑1234Mathieu Fourment, Michael R. Gillings. A comparison of common programming languages used in bioinformatics (англ.) // BMC Bioinformatics. — 2008. — 5 February (vol. 9,iss. 1). —P. 82. —ISSN1471-2105. —doi:10.1186/1471-2105-9-82. Архивировано 19 марта 2021 года.
- ↑12345678A Bogdanchikov, M Zhaparov, R Suliyev. Python to learn programming (англ.) // Journal of Physics: Conference Series. — 2013-04-10. — 10 April (vol. 423). —P. 012027. —ISSN1742-6596 1742-6588, 1742-6596. —doi:10.1088/1742-6596/423/1/012027. Архивировано 9 июня 2021 года.
- ↑Pascal Fua, Krzysztof Lis. Comparing Python, Go, and C++ on the N-Queens Problem // Computer Vision Laboratory, EPFL. — 2020. Архивировано 12 марта 2020 года.
- ↑Guido van Rossum. Comparing Python to Other Languages (англ.). Python.org (1997). Дата обращения: 16 марта 2021. Архивировано 16 марта 2021 года.
- ↑Muhammad Shoaib Farooq, Sher Afzal Khan, Farooq Ahmad, Saeed Islam, Adnan Abid. An Evaluation Framework and Comparative Analysis of the Widely Used First Programming Languages (англ.) // PLoS ONE. — 2014. — 24 February (vol. 9,iss. 2). —ISSN1932-6203. —doi:10.1371/journal.pone.0088941. —PMID24586449. Архивировано 15 марта 2021 года.
- ↑Kincaid, Jason (10 ноября 2009).Google's Go: A New Programming Language That's Python Meets C++.TechCrunch.Архивировано 18 января 2010. Дата обращения: 16 февраля 2021.
- ↑Go 1.18 Release Notes - The Go Programming Language (англ.). go.dev. Дата обращения: 27 мая 2023. Архивировано 27 мая 2023 года.
- ↑Ceyhun Ozgur, Taylor Colliau, Grace Rogers, Zachariah Hughes, Elyse “Bennie” Myer-Tyson. MatLab vs. Python vs. R (англ.) // Journal of Data Science. — 2017. —Vol. 15. —P. 355—372. —ISSN1680-743X. Архивировано 11 апреля 2021 года.
- ↑Alex MacCaw. The Little Book on CoffeeScript. — O'Reilly, 2012. —ISBN 9781449321055.
- ↑Proposals: iterators and generators [ES4 Wiki] . wiki.ecmascript.org. Дата обращения: 24 ноября 2008. Архивировано изоригинала 20 октября 2007 года.
- ↑Strachan, James. Groovy – the birth of a new dynamic language for the Java platform (29 августа 2003). Дата обращения: 11 июня 2007. Архивировано изоригинала 5 апреля 2007 года.
- ↑Why We Created Julia . Julia website (февраль 2012). — «We want something as usable for general programming as Python [...]». Дата обращения: 5 июня 2014. Архивировано 2 мая 2020 года.
- ↑Yegulalp, Serdar. Nim language draws from best of Python, Rust, Go, and Lisp . InfoWorld (16 января 2017). — «Nim's syntax is strongly reminiscent of Python's, as it uses indented code blocks and some of the same syntax (such as the way if/elif/then/else blocks are constructed).» Дата обращения: 16 февраля 2021. Архивировано 13 октября 2018 года.
- ↑An Interview with the Creator of Ruby . Linuxdevcenter.com. Дата обращения: 3 декабря 2012. Архивировано 28 апреля 2018 года.
- ↑Lattner, Chris. Chris Lattner's Homepage . Chris Lattner (3 июня 2014). — «I started work on the Swift Programming Language in July of 2010. I implemented much of the basic language structure, with only a few people knowing of its existence. A few other (amazing) people started contributing in earnest late in 2011, and it became a major focus for the Apple Developer Tools group in July 2013 [...] drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.» Дата обращения: 3 июня 2014. Архивировано 22 декабря 2015 года.
- ↑Python / C++ GNU g++ . Computer Language Benchmarks Game. Дата обращения: 1 июля 2009. Архивировано 28 января 2011 года.
- ↑Ars Technica report on Unladen Swallow goals (англ.). Дата обращения: 29 октября 2017. Архивировано 1 мая 2012 года.
- ↑MicroPython - Python for microcontrollers (англ.). micropython.org. Дата обращения: 9 октября 2023. Архивировано 6 июня 2014 года.
- ↑Яворски, Зиаде, 2021, p. 466.
- ↑Palach, 2014, pp. 16—17.
- ↑sys#sys.getswitchinterval() . Документация Python. Дата обращения: 25 октября 2021. Архивировано 25 октября 2021 года.
- ↑sys#sys.setswitchinterval() . Документация Python. Дата обращения: 25 октября 2021. Архивировано 25 октября 2021 года.
- ↑Guido van Rossum. the future of the GIL . Python Mailing Lists (8 мая 2007). Дата обращения: 3 марта 2021. Архивировано 9 ноября 2020 года.
- ↑Guido van Rossum. It isn't Easy to Remove the GIL . artima.com (10 сентября 2007). Дата обращения: 3 марта 2021. Архивировано 6 июня 2019 года.
- ↑Python-Dev] Reworking the GIL . Дата обращения: 7 декабря 2010. Архивировано 10 июня 2011 года.
- ↑1234PEP 703 – Making the Global Interpreter Lock Optional in CPython | peps.python.org . Дата обращения: 8 октября 2023. Архивировано 13 октября 2023 года.
- ↑Python 3000 FAQ . Дата обращения: 8 августа 2007. Архивировано 9 ноября 2020 года.
- ↑multiprocessing — Process-based parallelism . Python documentation. Дата обращения: 9 октября 2023. Архивировано 9 октября 2023 года.
- ↑perlthrtut — perldoc.perl.org . Дата обращения: 10 апреля 2008. Архивировано 22 мая 2008 года.
- ↑What’s New In Python 3.13 (англ.). Python documentation. Дата обращения: 30 сентября 2024. Архивировано 29 сентября 2024 года.
- ↑12zephyrfalcon.org :: labs :: 10 Python pitfalls . Архивировано изоригинала 10 августа 2013 года.
- ↑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. — [Архивировано 22 января 2021 года.]
- ↑Luciano Ramalho. Python tuples: immutable but potentially changing - O'Reilly Radar (англ.). radar.oreilly.com. O'Reilly (15 октября 2014). Дата обращения: 16 января 2021. Архивировано 16 января 2021 года.
- ↑8. Compound statements — Python 3.7.2 documentation . docs.python.org. Дата обращения: 5 февраля 2019. Архивировано 27 ноября 2019 года.
- ↑Built-in Types . Python documentation. Дата обращения: 9 октября 2023. Архивировано 14 июня 2020 года.
- ↑Obi Ike-Nwosu. Read Inside The Python Virtual Machine | Leanpub (рус.). Inside The Python Virtual Machine. leanpub.com. Дата обращения: 23 марта 2021. Архивировано 29 января 2021 года.
- ↑12Получено с помощью
dis.dis('print("Hello World!")'). - ↑К. Рейт, Т. Шлюссер, 2017, p. 23.
- ↑Python for S60 — OpenSource . Архивировано 6 августа 2009 года.
- ↑IronPython . Дата обращения: 24 июля 2007. Архивировано 18 августа 2006 года.
- ↑Python for .NET . Дата обращения: 10 февраля 2007. Архивировано 16 февраля 2007 года.
- ↑tinypy . Дата обращения: 21 августа 2008. Архивировано 18 сентября 2008 года.
- ↑MicroPython . Дата обращения: 4 июня 2014. Архивировано 6 июня 2014 года.
- ↑Сайт проекта Brython . Дата обращения: 6 ноября 2014. Архивировано 20 октября 2014 года.
- ↑Сайт проекта QPython . Дата обращения: 3 февраля 2015. Архивировано 4 февраля 2015 года.
- ↑PyPy[coding-guide] . Дата обращения: 24 июля 2007. Архивировано изоригинала 7 июля 2007 года.
- ↑PyPy carbonpython . Дата обращения: 24 июля 2007. Архивировано изоригинала 12 сентября 2007 года.
- ↑Cython: C-Extensions for Python . Дата обращения: 28 июля 2007. Архивировано 11 августа 2007 года.
- ↑Nuitka the Python Compiler — Nuitka the Python Compiler documentation . nuitka.net. Дата обращения: 9 октября 2023. Архивировано 3 сентября 2022 года.
- ↑Архивированная копия . Дата обращения: 1 июня 2006. Архивировано изоригинала 4 августа 2018 года.
- ↑bpython interpreter . Дата обращения: 17 февраля 2011. Архивировано 11 мая 2011 года.
- ↑IDLE . Python documentation. Дата обращения: 9 октября 2023. Архивировано 4 июня 2020 года.
- ↑PyDev - Python IDE for Eclipse (англ.). Eclipse Plugins, Bundles and Products - Eclipse Marketplace. Дата обращения: 9 октября 2023. Архивировано 18 октября 2023 года.
- ↑KDevelop Python Support (англ.). KDE Applications. Дата обращения: 9 октября 2023. Архивировано 4 октября 2023 года.
- ↑Python in Visual Studio Code (англ.). code.visualstudio.com. Дата обращения: 9 октября 2023. Архивировано 18 октября 2023 года.
- ↑Visual Studio Python IDE - Python Development Tools for Windows (амер. англ.). Visual Studio. Дата обращения: 9 октября 2023. Архивировано 2 октября 2023 года.
- ↑Васильев Денис Алексеевич. Методические особенности изучения языка Python школьниками // Символ науки. — 2017. —№ 1. Архивировано 21 июля 2021 года.
- ↑123456Mark 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. — [Архивировано 10 апреля 2021 года.]
- ↑Cruz, Josef. A Jr Programmer Asked Me Why Google and YouTube Use Python (англ.). Medium (7 июня 2022). Дата обращения: 9 октября 2023. Архивировано 11 июня 2022 года.
- ↑Thank you, Guido (англ.). blog.dropbox.com. Дата обращения: 9 октября 2023. Архивировано 16 февраля 2021 года.
- ↑Jukka Lehtosalo. Our journey to type checking 4 million lines of Python (англ.). dropbox.tech. Dropbox (5 сентября 2019). Дата обращения: 22 сентября 2020. Архивировано 22 сентября 2020 года.
- ↑Python in production engineering . Дата обращения: 21 января 2017. Архивировано 2 февраля 2017 года.
- ↑What Powers Instagram: Hundreds of Instances, Dozens of Technologies . Дата обращения: 21 января 2017. Архивировано 9 июня 2021 года.
- ↑Grumpy: Go running Python! Архивировано 20 января 2017 года. — статья в Google Open Source Blog
- ↑12Christina Cardoza (12 февраля 2021).Google recommits to the Python ecosystem.SD Times.Архивировано 25 февраля 2021. Дата обращения: 4 апреля 2021.
- ↑Welcoming Google as a Visionary Sponsor of the PSF.News from the Python Software Foundation. 11 февраля 2021.Архивировано 9 апреля 2021. Дата обращения: 4 апреля 2021.
- ↑Google Cloud финансирует экосистему Python.Издательство «Открытые системы». 2 марта 2021.Архивировано 9 июня 2021. Дата обращения: 4 апреля 2021.
- ↑Eilif Muller, James A. Bednar, Markus Diesmann, Marc-Oliver Gewaltig, Michael Hines. Python in neuroscience (англ.) // Frontiers in Neuroinformatics. — 2015. — 14 April (vol. 9). —ISSN1662-5196. —doi:10.3389/fninf.2015.00011. Архивировано 30 ноября 2020 года.
- ↑Scripting & Extending Blender : Introduction (англ.). Blender Manual. Blender. Дата обращения: 21 сентября 2020. Архивировано 21 сентября 2020 года.
- ↑Python Scripting (англ.). www.sidefx.com. Дата обращения: 27 сентября 2020. Архивировано 29 сентября 2020 года.
- ↑Building a plugin for QGIS (англ.). Geographic Informations Systems (GIS) Program. National Center for Atmospheric Research. Дата обращения: 23 сентября 2020. Архивировано 23 сентября 2020 года.
- ↑Using GNS3 with Fedora (амер. англ.). Fedora Magazine (28 августа 2019). Дата обращения: 22 сентября 2020. Архивировано 1 октября 2020 года.
- ↑Ultimaker Cura GitHub . Дата обращения: 19 сентября 2020. Архивировано 17 сентября 2020 года.
- ↑natol Locker. 2020 Best 3D Printer Slicer Software (англ.). All3DP (2 января 2020). — «The list is sorted by popularity (via Alexa rank)». Дата обращения: 24 сентября 2020. Архивировано 13 августа 2020 года.
- ↑Peter Jurica, Cees Van Leeuwen. OMPC: an open-source MATLAB®-to-Python compiler (англ.) // Frontiers in Neuroinformatics. — 2009. —Vol. 3. —ISSN1662-5196. —doi:10.3389/neuro.11.005.2009. Архивировано 29 ноября 2020 года.
- ↑Ryabtsev, Alexander. 8 Reasons Why Python is Good for Artificial Intelligence and Machine Learning (амер. англ.). Software Development Blog & IT Tech Insights | Django Stars (11 марта 2019). Дата обращения: 9 октября 2023. Архивировано 18 октября 2023 года.
- ↑12Noah Gift, Jeremy M. Jones. Python for Unix and Linux System Administration. —ISBN 978-0-596-51582-9.
- ↑Топ-5 языков для машинного обучения (рус.). itWeek. Дата обращения: 10 декабря 2024. Архивировано 30 мая 2022 года.
- ↑Давыдов А. В., Жусупова А. К., Салыкова О. С. СРАВНЕНИЕ РАЗЛИЧНЫХ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ, ПРИМЕНЯЕМЫХ В МАШИННОМ ОБУЧЕНИИ // Вестник науки. . №2 (59).. — 2023. Архивировано 10 декабря 2024 года.
Литература
[править |править код]- Лучано Рамальо. Python. К вершинам мастерства :[рус.] = Fluent Python. O’Reilly, 2015 : [пер. с англ.]. — ДМК Пресс, 2016.
- Кеннет Рейтц, Таня Шлюссер. Автостопом по Python :[рус.] =The Hitchhiker`s Guide to Python : [пер. с англ.]. — Издательский дом «Питер», 2017. —ISBN 9785496030236.
- David M. Beazley. Python Essential Reference. — 4th Edition. — Addison-Wesley Professional, 2009. — 717 с. —ISBN 978-0672329784.
- Jan Palach. Parallel Programming with Python. — Packt Publishing Ltd, 2014.
- Яворски Михал, Зиаде Тарек. Python. Лучшие практики и инструменты :[рус.] =Expert Python Programming : [пер. с англ.]. — Издательский дом «Питер», 2021.
- Фёдоров, Д. Ю. Программирование на языке высокого уровня Python. — Москва: Издательство Юрайт, 2022. — 210 с. — (Высшее образование). —ISBN 978-5-534-14638-7.
Ссылки
[править |править код]- Официальный сайт (англ.)
- Страницы, использующие устаревший тег source
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
- Википедия:Cite web (не указан язык)
- Википедия:Cite web (заменить webcitation-архив: deadlink no)
- Страницы, использующие волшебные ссылки ISBN
- Википедия:Статьи с источниками из Викиданных
- ПРО:ИТ:Статьи по алфавиту
- ПРО:ИТ:Последняя правка: в текущем месяце
- Википедия:Статьи с незавершёнными разделами с февраля 2023 года
- Википедия:Статьи с незавершёнными разделами
- Википедия:Статьи с шаблонами недостатков по алфавиту
- Википедия:Статьи с незавершёнными разделами с октября 2023 года
- Википедия:Страницы с модулем Hatnote с красной ссылкой
- Википедия:Статьи с неоформленным списком литературы с декабря 2009 года
- Википедия:Статьи с неоформленным списком литературы
- Википедия:Ссылка на Викиучебник непосредственно в статье
- Википедия:Ссылка на Викитеку непосредственно в статье
- Статьи со ссылками на Викисклад
- Статьи с примерами кода Python