Вы находитесь на странице: 1из 10

Python

Python — высокоуровневый язык программирования общего назначения с


динамической строгой типизацией и автоматическим управлением памятью,
ориентированный на повышение производительности разработчика,
читаемости кода и его качества, а также на обеспечение переносимости
написанных на нём программ. Язык является полностью объектно-
ориентированным в том плане, что всё является объектами. Необычной
особенностью языка является выделение блоков кода пробельными
отступами. Синтаксис ядра языка минималистичен, за счёт чего на практике
редко возникает необходимость обращаться к документации. Сам же язык
известен как интерпретируемый и используется в том числе для написания
скриптов. Недостатками языка являются зачастую более низкая скорость
работы и более высокое потребление памяти написанных на нём программ
по сравнению с аналогичным кодом, написанным на компилируемых языках,
таких как C или C++.
Python является мультипарадигменным языком программирования,
поддерживающим императивное, процедурное, структурное, объектно-
ориентированное программирование, метапрограммирование и
функциональное программирование. Задачи обобщённого
программирования решаются за счёт динамической типизации. Аспектно-
ориентированное программирование частично поддерживается через
декораторы, более полноценная поддержка обеспечивается
дополнительными фреймворками. Такие методики как контрактное и
логическое программирование можно реализовать с помощью библиотек
или расширений. Основные архитектурные черты — динамическая
типизация, автоматическое управление памятью, полная интроспекция,
механизм обработки исключений, поддержка многопоточных вычислений с
глобальной блокировкой интерпретатора (GIL), высокоуровневые структуры
данных. Поддерживается разбиение программ на модули, которые, в свою
очередь, могут объединяться в пакеты.
Эталонной реализацией Python является интерпретатор CPython, который
поддерживает большинство активно используемых платформ и являющийся
стандартом де-факто языка. Он распространяется под свободной лицензией
Python Software Foundation License, позволяющей использовать его без
ограничений в любых приложениях, включая проприетарные. CPython
компилирует исходные тексты в высокоуровневый байт-код, который
исполняется в стековой виртуальной машине. К другим трём основным
реализациям языка относятся Jython (для JVM), IronPython (для CLR/.NET) и
PyPy. PyPy написан на подмножестве языка Python (RPython) и
разрабатывался как альтернатива CPython с целью повышения скорости
исполнения программ, в том числе за счёт использования JIT-компиляции.
Поддержка версии Python 2 закончилась в 2020 году. На текущий момент
активно развивается версия языка Python 3. Разработка языка ведётся через
предложения по расширению языка PEP (англ. Python Enhancement Proposal),
в которых описываются нововведения, делаются корректировки согласно
обратной связи от сообщества и документируются итоговые решения.
Стандартная библиотека включает большой набор полезных переносимых
функций, начиная с возможностей для работы с текстом и заканчивая
средствами для написания сетевых приложений. Дополнительные
возможности, такие как математическое моделирование, работа с
оборудованием, написание веб-приложений или разработка игр, могут
реализовываться посредством обширного количества сторонних библиотек,
а также интеграцией библиотек, написанных на Си или C++, при этом и сам
интерпретатор Python может интегрироваться в проекты, написанные на этих
языках. Существует и специализированный репозиторий программного
обеспечения, написанного на Python, — PyPI. Данный репозиторий
предоставляет средства для простой установки пакетов в операционную
систему и стал стандартом де-факто для Python. По состоянию на 2019 год в
нём содержалось более 175 тысяч пакетов.
Python стал одним из самых популярных языков, он используется в анализе
данных, машинном обучении, DevOps и веб-разработке, а также в других
сферах, включая разработку игр. За счёт читабельности, простого синтаксиса
и отсутствия необходимости в компиляции язык хорошо подходит для
обучения программированию, позволяя концентрироваться на изучении
алгоритмов, концептов и парадигм. Отладка же и экспериментирование в
значительной степени облегчаются тем фактом, что язык является
интерпретируемым. Применяется язык многими крупными компаниями,
такими как Google или Facebook. По состоянию на сентябрь 2022 года Python
занимает первое место в рейтинге TIOBE популярности языков
программирования с показателем 15,74%. «Языком года» по версии TIOBE
Python объявлялся в 2007, 2010, 2018, 2020 и 2021 годах.
История
Задумка по реализации языка появилась в конце 1980-х годов, а разработка
его реализации началась в 1989 году сотрудником голландского института
CWI Гвидо ван Россумом. Для распределённой операционной системы
Amoeba требовался расширяемый скриптовый язык, и Гвидо начал
разрабатывать Python на досуге, позаимствовав некоторые наработки для
языка ABC (Гвидо участвовал в разработке этого языка, ориентированного на
обучение программированию). В феврале 1991 года Гвидо опубликовал
исходный текст в группе новостей alt.sources. С самого начала Python
проектировался как объектно-ориентированный язык.
Гвидо ван Россум назвал язык в честь популярного британского комедийного
телешоу 1970-х «Летающий цирк Монти Пайтона», поскольку автор был
поклонником этого телешоу, как и многие другие разработчики того
времени, а в самом шоу прослеживалась некая параллель с миром
компьютерной техники.
Наличие дружелюбного, отзывчивого сообщества пользователей считается,
наряду с дизайнерской интуицией Гвидо, одним из факторов успеха Python.
Развитие языка происходит согласно чётко регламентированному процессу
создания, обсуждения, отбора и реализации документов PEP (англ. Python
Enhancement Proposal) — предложений по развитию Python.
3 декабря 2008 года, после длительного тестирования, вышла первая версия
Python 3000 (или Python 3.0, также используется сокращение Py3k). В Python
3000 устранены многие недостатки архитектуры с максимально возможным
(но не полным) сохранением совместимости со старыми версиями Python.
Дата окончания срока поддержки Python 2.7 первоначально была
установлена на 2015 год, а затем перенесена на 2020 год из опасения, что
большая часть существующего кода не может быть легко перенесена на
Python 3. Поддержка Python 2 была направлена лишь на уже существующие
проекты, новые проекты должны были использовать Python 3. Официально
Python 2.7 не поддерживается с 1 января 2020 года, хотя последнее
обновление вышло в апреле 2020. Больше никаких исправлений
безопасности или других улучшений для Python 2.7 не будет выпущено. С
окончанием срока службы Python 2.x поддерживаются только Python 3.6.x и
более поздние версии.
Концепция и философия
Язык использует динамическую типизацию вместе с подсчётом ссылок и
циклический сборщик мусора для менеджмента памяти. Также есть
динамические разрешения имён (динамическое связывание), которые
связывают имена методов и переменных во время выполнения программы.
Python предлагает поддержку функционального программирования в
традициях Лиспа. Так, в Python есть функции filter, map и reduce; также из
Лиспа были заимствованы понятия характеристик списков, ассоциативных
массивов (словарей), множеств и генераторов списков. Стандартная
библиотека содержит два модуля (itertools и functools), реализующие
инструменты, заимствованные из Haskell и Standard ML.
Разработчики языка Python придерживаются определённой философии
программирования, называемой «The Zen of Python». Её текст выдаётся
интерпретатором Python по команде import this (работает один раз за
сессию). Автором этой философии считается Тим Петерс (Tim Peters).
Вместо того, чтобы встроить в ядро Python всю функциональность языка, он
был спроектирован таким образом, чтобы быть легко расширяемым. Это
сделало язык популярным средством добавления программируемых
интерфейсов к существующим приложениям. Видение Гвидо Ван Россума
маленького ядра с большой стандартной библиотекой и легко расширяемым
интерпретатором проистекало из негативного опыта разработки языка ABC,
который придерживался противоположного подхода.
Python стремится к более простому, менее громоздкому синтаксису и
грамматике, предоставляя разработчикам выбор в их методологии
кодирования. В отличие от девиза Perl «есть несколько способов сделать
это», Python придерживается философии «должен существовать один — и,
желательно, только один — очевидный способ сделать это». Алекс
Мартелли[en], член Python Software Foundation, и автор книг по Python
пишет, что «Описывать что-то как „умное“ не считается комплиментом в
культуре Python».
Разработчики Python стремятся избежать преждевременной оптимизации и
отвергают патчи к некритическим частям эталонной реализации CPython,
которые могли бы предложить незначительное увеличение скорости за счёт
понятности кода. Однако есть способы повышения производительности.
Если в программе есть узкие места, связанные с выполнением ресурсоёмких
операций на центральном процессоре, но не связанные с использованием
операций ввода-вывода, то повысить производительность возможно за счёт
трансляции программы при помощи Cython в язык Си и последующей
компиляции[67]. Требовательные к вычислительным ресурсам части
программы также можно переписывать на язык Си и подключать как
отдельные библиотеки с привязками к Python.
Важная цель разработчиков Python — делать его забавным для
использования. Это было отражено в названии языка, данном в честь Монти
Пайтона. Также это отражено в иногда игривом подходе к обучающим
программам и справочным материалам, таким как примеры программ из
документаций, которые используют названия spam и eggs вместо
использующихся в документации множества других языков foo и bar.
Портируемость
Python портирован и работает почти на всех известных платформах — от КПК
до мейнфреймов. Существуют порты под Microsoft Windows, практически
под все варианты UNIX (включая FreeBSD и Linux), Android, 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. В версии 3.5 перестала поддерживаться Windows
XP. В версии 3.9 перестала поддерживаться Windows Vista и Windows 7.
При этом, в отличие от многих портируемых систем, для всех основных
платформ Python имеет поддержку характерных для данной платформы
технологий. Более того, существует специальная версия Python для
виртуальной машины Java — Jython, что позволяет интерпретатору
выполняться на любой системе, поддерживающей Java, при этом классы Java
могут непосредственно использоваться из Python и даже быть написанными
на Python. Также несколько проектов обеспечивают интеграцию с
платформой Microsoft.NET, основные из которых — IronPython и Python.NET.

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


Python поддерживает динамическую типизацию, то есть тип переменной
определяется только во время исполнения. Поэтому вместо «присваивания
значения переменной» лучше говорить о «связывании значения с некоторым
именем». К примитивным типам в Python относятся булевый, целое число
произвольной точности, число с плавающей запятой и комплексное число. Из
контейнерных типов в Python встроены: строка, список, кортеж, словарь и
множество. Все значения являются объектами, в том числе функции, методы,
модули, классы.
Добавить новый тип можно либо написав класс (class), либо определив
новый тип в модуле расширения (например, написанном на языке C).
Система классов поддерживает наследование (одиночное и множественное)
и метапрограммирование. Возможно наследование от большинства
встроенных типов и типов расширений.
Синтаксис и семантика
Язык обладает чётким и последовательным синтаксисом, продуманной
модульностью и масштабируемостью, благодаря чему исходный код
написанных на Python программ легко читаем. При передаче аргументов в
функции Python использует вызов по соиспользованию (call-by-sharing).

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

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

Выражения
Состав, синтаксис, ассоциативность и приоритет операций достаточно
привычны для языков программирования и призваны минимизировать
употребление скобок. Если сравнивать с математикой, то приоритеты
операторов зеркалируют соответствующие в математике, при этом оператор
присвоения значения = соответствует типографскому ←. Хотя приоритеты
операций позволяют не использовать скобки во многих случаях, на анализ
больших выражений может тратиться лишнее время, в результате чего в
таких случаях выгоднее явно расставлять скобки.

Отдельно стоит упомянуть операцию форматирования для строк (работает


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

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


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

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


— не редкость:
1 <= a < 10 and 1 <= b < 20

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

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

Для списков (и других последовательностей) Python предлагает набор


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

Имена
Имя (идентификатор) может начинаться с буквы любого алфавита в Юникоде
любого регистра или подчёркивания, после чего в имени можно
использовать и цифры. В качестве имени нельзя использовать ключевые
слова (их список можно узнать по import keyword; print(keyword.kwlist)) и
нежелательно переопределять встроенные имена. Имена, начинающиеся с
символа подчёркивания, имеют специальное значение.
В каждой точке программы интерпретатор имеет доступ к трём
пространствам имён (то есть отображениям имён в объекты): локальному,
глобальному и встроенному.
Области видимости имён могут быть вложенными друг в друга (внутри
определяемой функции видны имена из окружающего блока кода). На
практике с областями видимости и связыванием имён связано несколько
правил «хорошего тона», о которых можно подробнее узнать из
документации.

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

Вам также может понравиться