Меню
Главная
Случайная статья
Настройки
|
Python (МФА: [pa()n]; в русском языке встречаются названия питон[8] или пайтон[9]) — мультипарадигменный высокоуровневый язык программирования общего назначения с динамической строгой типизацией и автоматическим управлением памятью[1][10], ориентированный на повышение производительности разработчика, читаемости кода и его качества, а также на обеспечение переносимости написанных на нём программ[11]. Язык является полностью объектно-ориентированным в том плане, что всё является объектами[1]. Необычной особенностью языка является выделение блоков кода отступами[12]. Синтаксис ядра языка минималистичен, за счёт чего на практике редко возникает необходимость обращаться к документации[11]. Python — интерпретируемый язык, использующийся в том числе для написания скриптов[1]. Недостатками языка являются зачастую более низкая скорость работы и более высокое потребление памяти написанными на нём программами по сравнению с аналогичным кодом, написанным на компилируемых языках, таких как C или C++[1][11].
Python является мультипарадигменным языком программирования, поддерживающим императивное, процедурное, структурное, функциональное[1], асинхронное[3], объектно-ориентированное[1] программирование и метапрограммирование[2]. Задачи обобщённого программирования решаются за счёт динамической типизации[13][14]. Аспектно-ориентированное программирование частично поддерживается через декораторы[15], более полноценная поддержка обеспечивается дополнительными фреймворками[16]. Такие методики как контрактное и логическое программирование можно реализовать с помощью библиотек или расширений[17]. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью[1], полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений с глобальной блокировкой интерпретатора (GIL)[18], высокоуровневые структуры данных. Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты[19].
Эталонной реализацией Python является интерпретатор CPython, который поддерживает большинство активно используемых платформ[20], являющийся стандартом де-факто языка[21]. Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные[22]. CPython компилирует исходные тексты в высокоуровневый байт-код, который исполняется в стековой виртуальной машине[23]. К другим трём основным реализациям языка относятся Jython (для JVM), IronPython (для CLR/.NET) и PyPy[1][24]. PyPy написан на подмножестве языка Python (RPython) и разрабатывался как альтернатива CPython с целью повышения скорости исполнения программ, в том числе за счёт использования JIT-компиляции[24]. Поддержка версии Python 2 закончилась в 2020 году[25]. На текущий момент активно развивается версия языка Python 3[26]. Разработка языка ведётся через предложения по расширению языка PEP (англ. Python Enhancement Proposal), в которых описываются нововведения, делаются корректировки согласно обратной связи от сообщества и документируются итоговые решения[27].
Стандартная библиотека включает в себя большой набор полезных переносимых функций, начиная с возможностей для работы с текстом и заканчивая средствами для написания сетевых приложений. Дополнительные возможности, такие как математическое моделирование, работа с оборудованием, написание веб-приложений или разработка игр, могут реализовываться посредством обширного количества сторонних библиотек, а также интеграцией библиотек, написанных на Си или C++, при этом и сам интерпретатор Python может интегрироваться в проекты, написанные на этих языках[1]. Существует и специализированный репозиторий программного обеспечения, написанного на Python, — PyPI[28]. Данный репозиторий предоставляет средства для простой установки пакетов в операционную систему и стал стандартом де-факто для Python[29]. По состоянию на 2019 год в нём содержалось более 175 тысяч пакетов[28].
Python стал одним из самых популярных языков, он используется в анализе данных, машинном обучении, DevOps и веб-разработке, а также в других сферах, включая разработку игр. За счёт читабельности, простого синтаксиса и отсутствия необходимости в компиляции язык хорошо подходит для обучения программированию, позволяя концентрироваться на изучении алгоритмов, концептов и парадигм. Отладка же и экспериментирование в значительной степени облегчаются тем фактом, что язык является интерпретируемым[1][30]. Применяется язык многими крупными компаниями, такими как Google или Facebook[1].
Содержание
История
Задумка по реализации языка появилась в конце 1980-х годов, а разработка его реализации началась в 1989 году сотрудником голландского института CWI Гвидо ван Россумом[27]. Для распределённой операционной системы Amoeba требовался расширяемый скриптовый язык, и Гвидо начал разрабатывать Python на досуге, позаимствовав некоторые наработки для языка ABC (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале 1991 года Гвидо опубликовал исходный текст в группе новостей alt.sources[31]. С самого начала Python проектировался как объектно-ориентированный язык.
Гвидо ван Россум назвал язык в честь популярного британского комедийного телешоу 1970-х «Летающий цирк Монти Пайтона»[32], поскольку автор был поклонником этого телешоу, как и многие другие разработчики того времени, а в самом шоу прослеживалась некая параллель с миром компьютерной техники[11].
Наличие дружелюбного, отзывчивого сообщества пользователей считается, наряду с дизайнерской интуицией Гвидо, одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (англ. Python Enhancement Proposal) — предложений по развитию Python[33].
3 декабря 2008 года[34], после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется сокращение Py3k). В Python 3 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python.
Дата окончания срока поддержки Python 2.7 первоначально была установлена на 2015 год, а затем перенесена на 2020 год из опасения, что большая часть существующего кода не может быть легко перенесена на Python 3[35][36]. Поддержка Python 2 была направлена лишь на уже существующие проекты, новые проекты должны были использовать Python 3[26]. Официально Python 2.7 не поддерживается с 1 января 2020 года, хотя последнее обновление вышло в апреле 2020. Больше никаких исправлений безопасности или других улучшений для Python 2.7 не будет выпущено[25][37]. С окончанием срока службы Python 2.x поддерживаются только Python 3.6.x и более поздние версии[38].
Концепция и философия
Язык использует динамическую типизацию вместе с подсчётом ссылок и циклический сборщик мусора для менеджмента памяти[39]. Также есть динамические разрешения имён (динамическое связывание), которые связывают имена методов и переменных во время выполнения программы.
Python предлагает поддержку функционального программирования в традициях Лиспа. Так, в Python есть функции filter , map и reduce (начиная с Python 3, reduce находится в библиотеке functools )[40]; также из Лиспа были заимствованы понятия характеристик списков, ассоциативных массивов (словарей), множеств и генераторов списков[41]. Стандартная библиотека содержит два модуля (itertools и functools), реализующих инструменты, заимствованные из Haskell и Standard ML[42].
Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («Дзен Питона», или «Дзен Пайтона»)[43]. Её текст выдаётся интерпретатором Python по команде import this (работает один раз за сессию). Автором этой философии считается Тим Петерс (Tim Peters).
Философия начинается так[44]:
- Красивое лучше, чем уродливое.
- Явное лучше, чем неявное.
- Простое лучше, чем сложное.
- Сложное лучше, чем запутанное.
….
- Beautiful is better than ugly.
- Explicit is better than implicit.
- Simple is better than complex.
- Complex is better than complicated.
...
Вместо того, чтобы встроить в ядро Python всю функциональность языка, он был спроектирован таким образом, чтобы быть легко расширяемым. Это сделало язык популярным средством добавления программируемых интерфейсов к существующим приложениям. Видение Гвидо ван Россума маленького ядра с большой стандартной библиотекой и легко расширяемым интерпретатором проистекало из негативного опыта разработки языка ABC, который придерживался противоположного подхода[45].
Python стремится к более простому, менее громоздкому синтаксису и грамматике, предоставляя разработчикам выбор в их методологии кодирования. В отличие от девиза Perl «есть несколько способов сделать это», Python придерживается философии «должен существовать один — и, желательно, только один — очевидный способ сделать это»[46]. Алекс Мартелли[англ.], член Python Software Foundation и автор книг по Python пишет, что «Описывать что-то как „умное“ не считается комплиментом в культуре Python»[47].
Разработчики Python стремятся избежать преждевременной оптимизации и отвергают патчи к некритическим частям эталонной реализации CPython, которые могли бы предложить незначительное увеличение скорости за счёт понятности кода[48]. Однако есть способы повышения производительности. Если в программе есть узкие места, связанные с выполнением ресурсоёмких операций на центральном процессоре, но не связанные с использованием операций ввода-вывода, то повысить производительность возможно за счёт трансляции программы при помощи Cython в язык Си и последующей компиляции[49]. Требовательные к вычислительным ресурсам части программы также можно переписывать на языке Си и подключать как отдельные библиотеки с привязками к Python[24].
Важная цель разработчиков Python — делать его забавным для использования. Это было отражено в названии языка, данном в честь Монти Пайтона[32]. Также это отражено в иногда игривом подходе к обучающим программам и справочным материалам, таким как примеры программ из документаций, которые используют названия spam и eggs вместо использующихся в документации множества других языков foo и bar[50][51].
Портируемость
Python портирован и работает почти на всех известных платформах — от КПК до мейнфреймов. Существуют порты под Microsoft Windows, практически под все варианты UNIX (включая FreeBSD и Linux), Android[52], 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[53]. В версии 3.5 перестала поддерживаться Windows XP[54] В версии 3.9 перестала поддерживаться Windows Vista и Windows 7[55].
При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft COM/DCOM). Более того, существует специальная версия Python для виртуальной машины Java — Jython, что позволяет интерпретатору выполняться на любой системе, поддерживающей Java, при этом классы Java могут непосредственно использоваться из Python и даже быть написанными на Python. Также несколько проектов обеспечивают интеграцию с платформой Microsoft.NET, основные из которых — IronPython и Python.NET.
Типы и структуры данных
Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». Также Python поддерживает подсказки типов с помощью аннотаций, добавляющие поддержку последовательной типизации и позволяющие использовать статический анализ кода[56]. Подсказки типов не используются во время компиляции и исполнения кода непосредственно CPython[57], но могут использоваться некоторыми библиотеками, например, FastAPI. К примитивным типам в Python относятся булевый, целое число произвольной длины, число с плавающей запятой и комплексное число. Из контейнерных типов в Python встроены: строка, список, кортеж, словарь и множество[30]. Все значения являются объектами, в том числе функции, методы, модули, классы.
Добавить новый тип можно либо написав класс (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает наследование (одиночное и множественное) и метапрограммирование. Возможно наследование от большинства встроенных типов и типов расширений.
Типы, используемые в Python
Тип
|
Изменяемость
|
Описание
|
Примеры
|
bool
|
Неизменяемый
|
Логический тип
|
True
False
|
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[58]
|
...
Ellipsis Для NumPy:
x[i, ..., j] , что эквивалентно
x[i, :, :, j] [58]
|
float
|
Неизменяемый
|
Число с плавающей запятой. Степень точности зависит от платформы, но на практике обычно реализуется в виде 64-битного 53-разрядного числа[59]
|
1.414
|
frozenset
|
Неизменяемый
|
Неупорядочное множество, не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных
|
frozenset([4.0, 'string', True])
|
int
|
Неизменяемый
|
Целое число неограниченного размера[60]
|
42
|
list
|
Изменяемый
|
Список, может содержать внутри себя различные типы данных
|
[4.0, 'string', True]
[]
|
NoneType [К 1]
|
Неизменяемый
|
Объект, представляющий собой отсутствие значения, часто называемый Null[англ.] в других языках.
|
None
|
NotImplementedType [К 1]
|
Неизменяемый
|
Объект, который возвращается при перегрузке операторов, когда типы операндов не поддерживаются.
|
NotImplemented
|
range
|
Неизменяемый
|
Последовательность целых чисел от какого-то одного значения до другого, обычно используется для повторения операции несколько раз при помощи for[61]
|
range(1, 10)
range(10, -5, -2)
|
set
|
Изменяемый
|
Неупорядочное множество, не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных
|
{4.0, 'string', True}
set()
|
str
|
Неизменяемый
|
Строковый тип
|
'Wikipedia'
"Wikipedia"
"""Spanning
multiple
lines"""
|
tuple
|
Неизменяемый
|
Кортеж. Может содержать внутри себя различные типы данных. Может использоваться в качестве неизменяемого списка и в качестве записей с неименованными полями[62]
|
В качестве неизменяемого списка:
(4.0, 'string', True)
('single element',)
() В качестве записей:
lax_coordinates = (33.9425, -118.408056)
city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014) [62]
|
Синтаксис и семантика
Операторы
Набор операторов достаточно традиционен.
- Условный оператор
if (если). При наличии нескольких условий и альтернатив применяется необязательный блок elif (сокращение от else if), который может повторяться в коде неограниченное число раз. Если ни одно из условий не было соблюдено, то выполняется необязательный блок else (иначе).
- Оператор цикла
while .
- Оператор итерации
for .
- Операторы обработки исключений
try — except — else — finally .
- Оператор определения класса
class .
- Оператор определения функции, метода или генератора
def . Внутри возможно применение return (возврат) для возврата из функции или метода, а в случае генератора — yield (давать).
- Оператор сопоставления с образцом
match — case .
- Операторы вызова исключений
raise и assert .
- Оператор
pass ничего не делает. Используется для пустых блоков кода.
Система отступов
Одной из интересных синтаксических особенностей языка является выделение блоков кода с помощью отступов (пробелов или табуляций), поэтому в Python отсутствуют операторные скобки begin/end, как в языке Паскаль, или фигурные скобки, как в Си. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Тем, кто привык программировать на языках с явным выделением начала и конца блоков, такое поведение поначалу может показаться неинтуитивным и неудобным.
Сам Гвидо писал[63]:
Наверное, самой спорной особенностью Python является использование отступов для группировки операторов, что взято непосредственно из ABC. Это одна из особенностей языка, которая дорога моему сердцу. Это делает код Python более читабельным двумя способами. Во-первых, использование отступов уменьшает визуальное нагромождение и делает программы короче, тем самым сокращая объём внимания, необходимого для восприятия базовой единицы кода. Во-вторых, это даёт программисту меньше свободы в форматировании, тем самым делая возможным более единообразный стиль, что облегчает чтение чужого кода (сравните, например, три или четыре различных соглашения о размещении фигурных скобок в Си, каждое из которых имеет сильных сторонников).
Выражения
Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок. Если сравнивать с математикой, то приоритеты операторов зеркалируют соответствующие в математике, при этом оператор присвоения значения = соответствует типографскому . Хотя приоритеты операций позволяют не использовать скобки во многих случаях, на анализ больших выражений может тратиться лишнее время, в результате чего в таких случаях выгоднее явно расставлять скобки[26].
Отдельно стоит упомянуть операцию форматирования для строк (работает по аналогии с функцией printf() из Си), которая использует тот же символ, что и взятие остатка от деления:
>>> str_var = "world"
>>> print("Hello, %s" % str_var)
Hello, world
В версии 3.6 были добавлены форматированные строковые литералы, или f-строки, которые делают код более читаемым и лаконичным:>>> str_var = "world"
>>> print(f"Hello, {str_var}") # вывод с использованием f-строки
Hello, world
Python имеет удобные цепочечные сравнения:
1 <= a < 10 and 1 <= b < 20
Кроме того, логические операции (or и and ) являются ленивыми: если для вычисления значения операции достаточно первого операнда, этот операнд и является результатом, в противном случае вычисляется второй операнд логической операции. Это основывается на свойствах алгебры логики: например, если один аргумент операции «ИЛИ» (or ) является истиной, то и результат этой операции всегда является истиной. В случае, если второй операнд является сложным выражением, это позволяет сократить издержки на его вычисление. Этот факт широко использовался до версии 2.5 вместо условной конструкции:
a < b and "меньше" or "больше или равно"
Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант):
"строка и Юникод-строка одновременно"
'строка и Юникод-строка одновременно'
"""тоже строка и Юникод-строка одновременно"""
True or False # булевы литералы
3.14 # число с плавающей запятой
0b1010 + 0o12 + 0xA # числа в двоичной, восьмеричной и шестнадцатеричной системах счисления
1 + 2j # комплексное число
[1, 2, "a"] # список
(1, 2, "a") # кортеж
{'a': 1, 'b': 'B'} # словарь
{'a', 6, 8.8} # множество
lambda x: x**2 # анонимная функция
(i for i in range(10)) # генератор
Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза s[N:M] означает, что в срез попадают все элементы от N включительно до M, не включая. При этом индекс можно не указывать. Например, запись s[:M] означает, что в срез попадают все элементы с самого начала; запись s[N:] означает, что попадают все элементы до конца среза; запись s[:] означает, что попадают все элементы с начала и до конца.
Имена
Имя (идентификатор) может начинаться с буквы любого алфавита в Юникоде любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по import keyword; print(keyword.kwlist) ) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение[64].
В каждой точке программы интерпретатор имеет доступ к трём пространствам имён (то есть отображениям имён в объекты): локальному, глобальному и встроенному.
Области видимости имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.
Строки документации
Python предлагает механизм документирования кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — docstring. Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации[65] (переменная __doc__ ), что используется современными IDE.
В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить doctest для автоматического тестирования модуля.
Парадигмы программирования
Python — мультипарадигменный язык программирования. Полностью поддерживаются объектно-ориентированное, структурное[66], обобщённое, функциональное программирование[1] и метапрограммирование[2]. Базовая поддержка аспектно-ориентированного программирования реализуется за счёт метапрограммирования[15]. Множество других методик, в том числе контрактное[67][68] и логическое программирование[69] можно реализовать с помощью расширений.
Объектно-ориентированное программирование
Дизайн языка Python построен вокруг объектно-ориентированной модели программирования, но при всем этом Python не продвигает идею ООП как основу языка, как это делает C++ или Java[источник не указан 159 дней]. Реализация ООП в Python является хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками. В языке всё является объектами — либо экземплярами классов, либо экземплярами метаклассов. Исключением является базовый встроенный метакласс type . Таким образом, классы на самом деле являются экземплярами метаклассов, а производные метаклассы являются экземплярами метакласса type . Метаклассы являются частью концепции метапрограммирования и предоставляют возможность управления наследованием классов, что позволяет создавать абстрактные классы, регистрировать классы или добавлять в них какой-либо программный интерфейс в рамках библиотеки или фреймворка[2].
Классы по своей сути представляют план или описание того, как создать объект, и хранят в себе описание атрибутов объекта и методов для работы с ним. Парадигма ООП основывается на инкапсуляции, наследовании и полиморфизме[70]. Инкапсуляция в Python представлена возможностью хранения публичных и скрытых атрибутов (полей) в объекте с предоставлением методов для работы с ними[70], при этом на самом деле все атрибуты являются публичными, но для пометки скрытых атрибутов существует соглашение об именовании[71]. Наследование позволяет создавать производные объекты без необходимости повторного написания кода, а полиморфизм заключается в возможности переопределения любых методов объекта (в Python все методы являются виртуальными[71]), а также в перегрузке методов и операторов. Перегрузка методов в Python реализуется за счёт возможности вызова одного и того же метода с разным набором аргументов[70]. Особенностью Python является возможность модифицировать классы после их объявления, добавляя в них новые атрибуты и методы[26], также можно модифицировать и сами объекты, в результате чего классы могут использоваться как структуры для хранения произвольных данных[71].
В Python поддерживается множественное наследование. Само по себе множественное наследование является сложным, и его реализации сталкиваются с проблемами разрешения коллизий имён между родительскими классами и с возможным повторным наследованием от одного и того же класса в иерархии. В Python методы вызываются согласно порядку разрешения методов (MRO), который основан на алгоритме C3-линеаризации[72], в обычных случаях при написании программ не требуется знать принцип работы данного алгоритма, понимание же может потребоваться при создании нетривиальных иерархий классов[73].
Возможности и особенности, специфичные для Python:
- Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы.
- Перегрузка операторов (всех, кроме
is, '.', '=' и символьных логических).
- Свойства (имитация поля с помощью функций).
- Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).
- Методы для управления наиболее распространёнными операциями (истинностное значение,
len() , глубокое копирование, сериализация, итерация по объекту, …).
- Полная интроспекция.
- Классовые и статические методы, классовые поля.
- Классы, вложенные в функции и классы.
- Возможность модифицировать объекты во время исполнения программы.
Обобщённое программирование
Языки с поддержкой динамической типизации и объектно-ориентированного программирования обычно не рассматриваются в рамках обобщённого программирования, поскольку задачи обобщённого программирования решаются за счёт отсутствия ограничений на типы данных[13][14]. В Python обобщённое программирование со строгой типизацией достигается использованием средств языка совместно со внешними анализаторами кода[74], такими как Mypy[75].
Функциональное программирование
Несмотря на то, что Python изначально не задумывался как язык функционального программирования[76], он поддерживает функциональный стиль программирования, в частности[77]:
- функция является объектом первого класса,
- функции высших порядков,
- рекурсия,
- фокус на работу со списками,
- аналог замыканий,
- частичное применение функции с помощью метода
partial() ,
- возможность реализации других средств на самом языке (например, карринг).
Однако, в отличие от большинства языков, непосредственно ориентированных на функциональное программирование, Python не является чистым языком программирования и код не защищён от побочных эффектов[77][78].
В стандартной библиотеке Python существуют специальные пакеты operator и functools для функционального программирования[76].
Метапрограммирование
Python поддерживает метапрограммирование[79][2].
Асинхронное программирование
|
|