Skip to content

Latest commit

 

History

History
109 lines (60 loc) · 25.8 KB

lecture_conspect.md

File metadata and controls

109 lines (60 loc) · 25.8 KB

Введение в 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.

[К содержанию]

Какой язык Python?

Согласно определению на 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 используется для веб-разработки? Помимо очевидных причин, в виде наличия нативных инструментов для работы в вебе, Python имеет большое количество популярных фреймворков для веб-разработки, например, Django, Flask и FastAPI. Многие фреймворки позволяют использовать готовые каркасы, что значительно сокращает сроки разработки приложений, поскольку разработчикам не приходится реализовывать все с нуля.

  • Автоматизация. Python часто используется для автоматизации рутинных задач: конвертации большого количества файлов из одного формата в другой, изменение имен большого числа файлов, выполнения большого числа арифметических операций над большими массивами данных.

    Python используется для решения таких задача, поскольку он имеет большое число библиотек с функционалом, позволяющим с легкостью автоматизировать рутинные задачи. А простота и понятность синтаксиса сокращает время создания готовых решений.

  • Наука о данных. Python активно используется для анализа данных, для проведения экспериментов в области Искусственного Интеллекта и для реализации и деплоя ML-моделей. Причины использования Python для этих целей аналогичны выше перечисленным.

[К содержанию]

Почему вам следует изучить Python?

Опустим очевидную причину "чтобы сдать зачет" и рассмотрим причины, релевантные для студентов МФТИ:

  • Python требуется для прохождения многих учебных курсов. На следующих курсах учебы вас ждут такие дисциплины, как ML/DL, CV, математическая статистика и т.д. Для успешного прохождения этих дисциплин вам потребуется уверенное владения Python, а также знание основных библиотек для реализации научных вычислений и анализа данных.
  • Python будет полезен в дисциплинах, несвязанных с программированием. Так, Python может оказаться полезным инструментом для обработки лабораторных работ по общей физике: построению регрессии и визуализации трендов с коридорами ошибок.
  • Наконец, Python будет очень полезен для подготовки вашего диплома.

Абстрагируемся от МФТИ и приведем пару фактов, которые способны мотивировать вас к изучению Python:

  • Python - один из самых популярных языков программирования по версии StackOverflow. Популярность языка напрямую коррелирует с численностью сообщества и количеством обучающих и справочных материалов. Вам будет легче справляться с трудностями в изучении языка.
  • На момент 05.09.2024 на Head Hunter было более 12 тысяч вакансий с указанием Python в качестве требования к кандидату.
  • Медианная зарплата бекенд-разработчика за первое полугодие 2024 года по данным Хабр Карьеры составляет 200 тысяч рублей. Медианная зарплата аналитиков варьируется от 130 до 205 тысяч. Для работы в этих направления, как было сказано ранее, требуется Python.

[К содержанию]