Python, основные принципы
материал посвящен теоретическому обзору возможностей языка программирования Python
Python (Пайтон, или как его чаще называют: Питон) – это интерпретируемый алгоритмический объектно-ориентированный язык с динамической типизацией, автоматическим управлением памятью и высокоуровневыми структурами данных, в которые входят: словари (хеш-таблицы), списки, кортежи. Язык поддерживает классы, модули (объединяющиеся в пакеты), исключения и многопоточные вычисления. Полиморфизм в нем реализован в виде Duck Typing. Кроме всего перечисленного Python также отличает и синтаксис.
Язык программирования Python, являясь в первую очередь объектно-ориентированным, также поддерживает и другие парадигмы программирования: структурное, функциональное и аспектно-ориентированное. Большая часть реализаций языка, включая CPython, – интерпретаторы.
Язык в общем и CPython в частности поддерживают большинство активно используемых платформ. Он свободно распространяется под открытой либеральной лицензией, которая позволяет использовать его без ограничений в любых приложениях, в том числе и проприетарных.
Питон – один из самых популярных и быстроразвивающихся языков программирования. Новые версии, содержащие добавление и изменения языковых свойств, выходят в среднем раз в два года. По этой причине на Python отсутствуют ANSI, ISO и другие официальные стандарты, роль которых выполняет CPython. О широком распространении и популярности языка отчасти говорит и тот факт, что именно он был выбран Google App Engine как единственный возможный (на данный момент) язык написания веб-приложений.
История языка загибает второй десяток пальцев. Питон был создан в начале 90-х годов сотрудником голландского института CWI по имени Гвидо ван Россум (Guido van Rossum), который сегодня работает в Google.
Для операционной системы Amoeba требовался расширяемый скриптовый язык, именно по этой причине Гвидо начал писать Питон на досуге, и это занятие изначально было всего лишь хобби. Первоначальная версия языка программирования заимствовала наработки из языка ABC, в разработке которого Гвидо опять-таки принимал участие. После этого язык появился в сети, и его по достоинству оценили другие программисты.
Рабочие версии языка появились достаточно поздно, по этой причине в Питоне чувствуется влияние множества других языков программирования. Например:
- уже упомянутый ABC, из которого были заимствованы: отступы для группировки операторов, высокоуровневые структуры данных. Стоит отметить, что фактически Python создавался для исправления ошибок, допущенных при проектировании ABC;
— Modula-3, из которого в Питон пришли пакеты, модули, использование else наряду с try и except, именованные аргументами функций;
— C, C++, из этих языков, по словам самого Гвидо, были заимствованы наиболее непротиворечивые синтаксические конструкции. Сделано это, чтобы не вызвать неприязнь у программистов на C к Питону;
— Smalltalk – само объектно-ориентированное программирование;
— из языка Lisp Питон забрал отдельные черты функционального программирования, такие как lambda, map, reduce, filter и другие;
— из языка Fortran — срезы массивов, комплексную арифметику;
— из Miranda – списочные выражения;
— из Icon – генераторы;
— из Java — модули loggin, unittest, threading, xml.sax стандартной библиотеки, использование @ для декораторов и совместное использование finally и except при обработке исключений.
Как видно, язык программирования Python заимствовал действительно много полезных и функциональных черт из других, более старых и развитых языков программирования.
Наиболее часто все же Питон сравнивают с языками Perl и Ruby. Эти интерпретируемые языки обладают примерно одинаковой скоростью выполнения программ, и Python, как и Perl, может успешно применяться для написания скриптов. Как и Ruby (хотя здесь, конечно, скорее Ruby как Python), обладает хорошо продуманной системой ООП.
Несмотря на то что Питон в целом обладает достаточно обособленным синтаксисом, одним из принципов дизайна языка является «принцип наименьшего удивления», когда язык ведет себя именно так, как от него этого ожидает программист.
Трансляция Питона организована схожим с Java образом. Исходник компилируется в байт-код, а зачем этот байт-код исполняется. Сходство настолько велико, что существует реализация Питона, генерирующая Java байт-код для исполнения виртуальной машиной Java. Называется это Jython.
Различие между этими двумя языками состоит в том, когда записывать байт-код на диск. Для Java традиционным способом запустить только что написанную программу является: запустить компилятор, подсовывая ему исходник. После чего он генерирует байт-код и записывает его в файл. После этого запускается виртуальная машина, которой дается сам байт-код, и она его исполняет.
Питон, в свою очередь, обычно не записывает байт-код на диск. В простейшем случае запуск программы происходит следующим образом: исходник предоставляется интерпретатору, который генерирует байт-код, но оставляет его в памяти. После этого передается виртуальной машине (которая является частью интерпретатора). Именно это ускоряет запуск программы за счет отсутствия необходимости записывать байт-код на диск.
Однако при загрузке (импорте) модулей Питон пытается сохранить байт-код, чтобы в следующий раз загрузка модуля была быстрее. Присутствует и возможность саму программу записать в виде байт-кода. Интерпретатору Питона можно давать не только исходники, но и байт-код, который загружается быстрее.
За счет этого Python и Java имеют столь большое сходство в производительности, которое практически одинаково, однако Питон загружает программы быстрее.
Еще одно уже упомянутое сходство не только с Java, но и многими другими интерпретируемыми и компилируемыми языками — это автоматическое управление памятью. В Питоне нет new[] и delete []. Память отводится и освобождается автоматически. Алгоритм сборки мусора следующий: сам интерпретатор реализует reference counting (удаляя объекты, на которые никто не ссылается), а также время от времени запускается garbage collector, работающий по более замысловатым, но более быстрым и надежным алгоритмам работы (надежным в данном случае называется то, что reference counting не удалит два объекта, ссылающихся друг на друга, даже если на них больше ничего не ссылается).
Еще одним удобным свойством интерпретатора Питона является наличие REPL (read-eval-print loop). Это предоставляет возможность вводить языковые конструкции с консоли и тут же получать результат, что часто используется для проверки идей или осуществления отладки.
Как уже не раз отмечалось, Python – объектно-ориентированный язык программирования. Кроме всего прочего, это в первую очередь означает: все есть объект.
В языке C++, на примере которого традиционно обучают ООП, объектами являются исключительно экземпляры классов. Числа же объектами не являются.
В Java значения атомарных типов тоже являются объектами, но искусственно: для них создаются так называемые boxed-значения, то есть для каждого числа создается экземпляр специального класса, содержащий это число.
В Python, в свою очередь, все является объектом, будь то экземпляры классов, сами классы, типы, атомарные объекты (числа и строки) и функции, например:
>>> a = 1
>>> a.__str__() # этот метод дает строковое представление объекта
'1'
Функции Питона принимают в качестве аргументов объекты и возвращают объекты. Это значит, что функция может принимать функцию в качестве аргумента и возвращать класс или принимать строку и возвращать функцию.
Функциональное программирование, хоть и не является родной парадигмой Python, может быть использовано. Но в Питоне нет оптимизации хвостовой рекурсии (а недавно Гвидо подтвердил, что и не будет), что делает практически невозможным программирование в характерном для ФП рекурсивном стиле.
Но, несмотря на это, некоторые элементы функционального программирования могут быть эффективно использованы. В частности, применение конструкции lambda, которая создает анонимную функцию (если быть точным – замыкание, то есть создаваемая функция как бы запоминает значения внешних переменных в момент создания). Другие типичные конструкции, заимствованные из функциональных языков, – это стандартные функции map, filter, zip и специальная форма, называемая списочным сокращением – list comprehension.
Библиотеки Python
Богатая стандартная библиотека Питона является одной из привлекательнейших сторон языка. В ней имеются средства для работы со многими сетевыми протоколами и форматами, к примеру: модули для написания HTTP-серверов и клиентов, инструменты для разбора и создания почтовых сообщений, работы с XML и многим другим. Набор модулей для работы с операционной системой позволяет писать кросс-платформенные приложения. Кроме того, существуют и модули для работы с регулярными выражениями, текстовыми кодировками, мультимедийными форматами, протоколами криптографии, архивами, для сериализации данных, поддержки юнит-тестирования и многого другого.
Естественно, кроме стандартной библиотеки существует и множество других, предоставляющих интерфейс ко всем системным вызовам на разных платформах. На Win32-платформе поддерживаются все вызовы Win32 API и COM, в объеме ничуть не меньшем, чем у Visual Basic и Delphi. А количество прикладных библиотек для Питона в самых разных областях без преувеличения огромно: Веб, базы данных, обработка изображений и текста, численные методы, приложения ОС и так далее.
Питон и подавляющее большинство библиотек к нему бесплатны и поставляются в виде исходников. Более того, в отличие от многих открытых систем лицензия Python никак не ограничивает использование языка в коммерческих целях и не налагает никаких обязательств, кроме указания авторских прав.
Преимущества Python
— Скорость выполнения программ, написанных на Питоне, очень высока. И субъективно, и по сравнению с другими распространенными языками программирования. Это связано с тем, что основные библиотеки написаны на C++ и выполнение задач занимает меньше времени, чем на других языках высокого уровня.
— Вытекающее из этого – есть возможность писать свои собственные модули для Питона на С или С++.
— В стандартных библиотеках Питона можно найти средства для работы с электронной почтой, протоколами Интернета, FTP, HTTP, базами данных и многим другим.
— Скрипты, написанные на Питоне, выполняются на большинстве современных ОС. Такая кросс-платформенность обеспечивает применение языка в самых различных областях и оболочках.
— Питон универсален в том плане, что он подходит для решения любых задач в области программирования, будь то офисные программы, веб-приложения, GUI-приложения или нечто другое.
Подытоживая все вышесказанное, можно сказать одно: Python является на сегодняшний день одним из самых широко развитых и активно развивающихся языков программирования. Все больше программистов начинают писать на Python программы, служащие иногда диаметрально противоположным целям, что говорит об универсальности и простоте написания программ на Питоне.