Содержание:
- Реализации Python;
- Какой язык Python?;
- Что и почему пишут на Python?;
- Почему вам следует изучить Python?;
Существует ощутимая разница между языком программирования и его реализацией. Сам по себе язык программирования является формальным языком, определяющим набор лексических, синтаксических и семантических правил для корректной записи программ. Язык программирование является некоторой абстракцией и не всегда отражает точное физическое устройство системы. Совсем другое дело - реализация языка. Реализация языка на физическом уровне определяет процесс исполнения программы, написанной на данном языке программирования. Например, реализация языка программирования позволяет определить, как работает выделение памяти, как в памяти компьютера сохраняются данные, используемые в вашей программе и т.д.
Существует четыре основные реализации языка программирования Python:
-
CPython
. CPython - это эталонная реализация Python, созданная в 1991 году Гвидо Ван Россумом. CPython включает в себя компилятор, интерпретатор, набор встроенных модулей и инструментов. Значительная часть элементов, распространяемых вместе с CPython, написана на языке программирования C, именно поэтому название реализации содержит букву C. CPython может быть использован на любой платформе, на которой компилятор C позволяет компилировать код в соответствии со стандартом ISO/IEC 9899:1990, т.е. на любой современной платформе. -
Jython
. Реализация Python, которая использует Java Virtual Machine (JVM) для исполнения кода. Данная реализация совместима с модулями и фреймворками Java. Jython может быть использован на любой платформе, поддерживающей JVM. -
IronPython
. Реализация Python для совместного использования библиотек и фреймворков .NET CLR. -
PyPy
. Быстрая и гибкая реализация Python, написанная на ограниченном подмножестве языка Python. Является мультиплатформенной. РеализацияPyPy
обладает преимуществами в области быстродействия и управления памятью.
В нашем курсе мы будем обсуждать исключительно CPython
. Это связано в первую очередь с тем, что CPython
является эталонной реализацией Python, и все остальные реализации во многом ориентируются именно на CPython
. Также CPython
является самой стабильной и самой популярной реализацией, что упрощает поиск справочных материалов по любой проблеме, возникающей при работе с CPython
. Ну и наконец вместе с CPython
вы получаете доступ к большому количеству инструментов, помимо самого компилятора и интерпретатора. К числу таких инструментов, например, относится менеджер пакетов PIP
.
Согласно определению на Wikipedia Python - это мультипарадигмальный высокоуровневый язык программирования общего назначения с динамической строгой типизацией и автоматическим управлением памятью. Некоторые могут воспринять это определение как набор слов, поэтому стоит отдельно пояснить каждое понятие, использованное в определении.
Под парадигмой в программировании понимается совокупность средств для организации кода программ определенным образом. Помимо наличия средств стоит так же говорить о количестве усилий, требуемых для реализации программы в соответствии с определенной парадигмой. Так, если язык программирования поддерживает определенную парадигму программирования, вам не придется прикладывать каких-либо усилий сверх изучения языковых средств для работы в поддерживаемой парадигме. Напротив, если для работы в определенной парадигме на определенном языке вам приходится прикладывать значительные усилия для реализации с нуля примитивов, характерных для данной парадигмы, поскольку язык не обладает ими нативно, то такой язык не поддерживает выбранную вами парадигму.
Python не ограничивает вас в использовании одной определенной парадигмы программирования при создании ваших программ. Так, Python имеет нативную поддержку классов, а значит вы можете реализовать ваши задумки, используя объектно-ориентированную парадигму программирования. Т.е. организовать код вашей программы в виде взаимодействующих друг с другом объектов, обладающих определенными методами и состояниями. Однако это не делает Python строго объектно-ориентированным языком программирования. Если для вас ближе функциональное программирование, с помощью Python вы сможете организовать ваш код в соответствии с этой парадигмой. Более того, в языке на уровне встроенных объектов и стандартной библиотеки существуют функции высших порядков, характерные для функциональных языков. К их числу например относятся map
и reduce
.
Для точного понимания понятия высокоуровневости, нам придется отойти немного в сторону и поговорить о том, как команды обрабатывает компьютер, и как это делает человек. Люди выражают и понимают команды с помощью естественного языка. Т.е. языка, который мы с вами используем для повседневного общения. Компьютеры же понимаю команды только в виде бинарного кода. При разработке программ мы не можем заставить компьютеры выполнять нужные нам действия посредством использования естественного языка напрямую, нам придется писать команды с использованием бинарного кода.
Поскольку бинарный код и естественный язык, мягко говоря, очень сильно отличаются, а написание программ сразу в виде бинарного кода - не самое простое занятие, инженеры в области компьютерных наук стали искать способы упростить процесс разработки ПО. Так люди постепенно пришли к концепции виртуальной машины. Для упрощения процесса разработки ПО была введена абстракция, называемая виртуальной машиной. Под виртуальной машиной понимался компьютер, который способен напрямую выполнять программный код, написанный на языке L1
. Язык L1
был проще для человеческого восприятия, чем бинарный код L0
, а потому разработка программ для виртуальной машины M1
была несколько проще, чем разработка программ для исходной машины M0
. Когда код программы, написанной на языке L1
был готов, он переводился на язык L0
с помощью специальных программ, компиляторов или интерпретаторов, после чего, целевая машина M0
могла запустить созданную программу.
К сожалению, в силу технических ограничений, при разработке программ-переводчиков с языка L1
на язык L0
, язык L1
хоть и являлся более человеко-читаемым, все же оставался далек от естественного языка. Решение этой проблемы заключалось в добавлении новых виртуальных машин, чьи языки набора команд все ближе и ближе приближались к естественному языку. Примером последовательности языков написания команд для виртуальных машин может быть следующая последовательность: Java -> JVM байт-код -> бинарный код. Чем язык программирования в этой цепочке ближе к бинарному коду, тем более он низкоуровневый и менее человеко-читаемый. И наоборот, чем дальше язык в этой цепочке от бинарного кода, тем более он высокоуровневый и более человеко-читаемый.
В этом плане Python и является языком высокого уровня. Python создавался с упором на повышение читаемости кода. В доказательство высокоуровневости языка, достаточно посмотреть на некоторые синтаксические конструкции, которые напоминают предложения на естественном языке:
banned_elems = set()
if elem not in banned_elems:
...
Однако помимо самого языка CPython
также обладает CAPI, т.е. предоставляет пользователям возможность расширять язык за счет написания собственных модулей на C. При работе с CAPI вам придется перемещаться на уровень абстракции, расположенный ближе к бинарному коду, а также думать о таких низкоуровневых вещах, как аллокация памяти, самостоятельно. Исходя из этого, корректней было бы утверждать, что Python обладает как API высокого уровня, так и низкоуровневым API.
Языками общего назначения называются языки программирования, которые могут быть использованы для создания программного обеспечения в различных доменах. В противовес языкам общего назначения существуют языки программирования для разработки ПО в определенном домене (англ. domain specific languages). К их числу относятся языки разметки или языки запросов. Однако границы языков общего назначения достаточно размыты. Так, язык программирования общего назначения может обладать особенностями, которые делают его особенно применимым в конкретном домене.
Типизация в языках программирования может быть классифицирована с помощью разных критериев. Если в качестве такого критерия выступает время проверки типов, то мы получаем деление на динамическую и статическую типизацию. В языках со статической типизацией проверка типов объектов происходит до выполнения самой программы. Примером языка со статической типизацией является C++. Если же проверка типов данных объектов происходит в момент исполнения программы, считается что язык обладает динамической типизацией.
По умолчанию в Python проверка типов происходит в процессе выполнения программы, поэтому он считается языком программирования с динамической типизацией. Однако, с помощью сторонних расширений вы можете добавить статическую типизацию в ваш проект. По этой причине некоторые эксперты называют Python языком программирования с опциональной статической типизацией.
Если рассмотреть классификацию типизации с позиции допустимости неявного преобразования типов, мы получим деление на строгую и нестрогую типизацию. Также в некоторых источниках это деление приводится в терминах сильная и слабая типизация. Языки программирования со строгой типизацией почти никогда не допускают неявного преобразования типов объектов во время выполнения операций. Языки программирования с нестрогой типизацией, наоборот, стараются как можно чаще использовать неявные преобразования типов, чтобы не допустить падения программы. Примером языка со слабой типизацией является Java Script.
Стоит отметить, что понятия динамической и строгой типизации - это не бинарные понятия, а градиенты. Языки программирования могут быть более или менее динамически типизированными, а также более или менее строго типизированными.
Любые данные, которые вы используете в своей программе, написанной на Python, являются объектом. В исходном C-коде Python любой объект представляет собой структуру данных с определенными полями. Одним из таких полей является поле, ответственное за подсчет ссылок на данный объект. Это сделано постольку, поскольку в Python реализуется ссылочная модель памяти. Новые объекты не создаются без нужды, в части случаев создается лишь новая ссылка на объект. Сам C-объект хранит счетчик активных ссылок. Если счетчик положителен, объект остается в памяти. Если счетчик обнуляется, специальная программа, называемая сборщиком мусора, удалит этот объект из памяти. Вам, как пользователю, не придется задумываться о выделении памяти или удаления объектов из памяти. Весь процесс управления памятью полностью автоматизирован за счет использования счетчиков ссылок и сборщика мусора. В этом смысле Python считается языком с автоматическим управлением памятью.
Как было сказано выше, Python является языком общего назначения. Т.е. вы можете использовать Python для написания программ в различных доменах. Однако существует ряд областей, с которыми обычно ассоциируется программирование на Python. Перечислим их:
-
Веб-разработка
. Python является одним из основных языков программирования для веб-разработки, т.е. реализации сложных серверных функций для обработки веб-запросов. Например, веб-приложения могут взаимодействовать с базой данных, шифровать результаты чтения данных из базы и отправлять зашифрованный вариант по сети. Все это можно реализовать с помощью Python.Почему Python используется для веб-разработки? Помимо очевидных причин, в виде наличия нативных инструментов для работы в вебе, Python имеет большое количество популярных фреймворков для веб-разработки, например,
Django
,Flask
иFastAPI
. Многие фреймворки позволяют использовать готовые каркасы, что значительно сокращает сроки разработки приложений, поскольку разработчикам не приходится реализовывать все с нуля. -
Автоматизация
. Python часто используется для автоматизации рутинных задач: конвертации большого количества файлов из одного формата в другой, изменение имен большого числа файлов, выполнения большого числа арифметических операций над большими массивами данных.Python используется для решения таких задача, поскольку он имеет большое число библиотек с функционалом, позволяющим с легкостью автоматизировать рутинные задачи. А простота и понятность синтаксиса сокращает время создания готовых решений.
-
Наука о данных
. Python активно используется для анализа данных, для проведения экспериментов в области Искусственного Интеллекта и для реализации и деплоя ML-моделей. Причины использования Python для этих целей аналогичны выше перечисленным.
Опустим очевидную причину "чтобы сдать зачет" и рассмотрим причины, релевантные для студентов МФТИ:
- Python требуется для прохождения многих учебных курсов. На следующих курсах учебы вас ждут такие дисциплины, как ML/DL, CV, математическая статистика и т.д. Для успешного прохождения этих дисциплин вам потребуется уверенное владения Python, а также знание основных библиотек для реализации научных вычислений и анализа данных.
- Python будет полезен в дисциплинах, несвязанных с программированием. Так, Python может оказаться полезным инструментом для обработки лабораторных работ по общей физике: построению регрессии и визуализации трендов с коридорами ошибок.
- Наконец, Python будет очень полезен для подготовки вашего диплома.
Абстрагируемся от МФТИ и приведем пару фактов, которые способны мотивировать вас к изучению Python:
- Python - один из самых популярных языков программирования по версии StackOverflow. Популярность языка напрямую коррелирует с численностью сообщества и количеством обучающих и справочных материалов. Вам будет легче справляться с трудностями в изучении языка.
- На момент 05.09.2024 на Head Hunter было более 12 тысяч вакансий с указанием Python в качестве требования к кандидату.
- Медианная зарплата бекенд-разработчика за первое полугодие 2024 года по данным Хабр Карьеры составляет 200 тысяч рублей. Медианная зарплата аналитиков варьируется от 130 до 205 тысяч. Для работы в этих направления, как было сказано ранее, требуется Python.