Библиотеки Python. Часть 1. Встроенные модули
Аннотация
Python — высокоуровневый язык программирования, объектно-ориентированный, модульный и подчеркнуто легкочитаемый, что делает его очень простым в изучении. Python широко применяется в образовательной сфере, для научных вычислений, больших данных и машинного обучения, в веб-разработке, графике, GUI, играх и других направлениях. В связи с огромной сферой применения существует уже бесчисленное количество библиотек, упрощающих программирование на этом языке без необходимости написания излишнего кода. На этом уроке мы начнем знакомство со стандартными библиотеками языка Python.
Библиотеки как наследие
У каждого языка программирования есть свои особенности, в том числе и у Python. Есть сферы деятельности, где он любим, а есть области, в которых он не очень силен и не пользуется популярностью.
Сначала поговорим о сильных сторонах.
Сильные стороны Python
На Python легко научиться программировать (именно поэтому вы его и изучаете)
Благодаря строению языка и его динамической скриптовой природе разрабатывать на Python можно очень быстро
Принцип прост: быстро изучить — быстро программировать.
В результате языком Python заинтересовались люди, которым нужно автоматизировать какие-то процессы в своей деятельности или «склеивать» несколько взаимосвязанных программ в комплексы. Обычно эти люди не программисты по специальности. Это инженеры, преподаватели, математики, физики, биологи, лингвисты — все они часто применяют Python в своей практике.
Вторая причина популярности Python связана с тем, что он очень быстро стал интегрироваться с огромным количеством библиотек, написанных на других языках программирования. Что-то очень похожее было когда-то с языком программирования Perl и его платформой CPAN.
Теперь пришел черед познакомиться с термином «библиотека» в контексте программирования.
Библиотека
Библиотека в программировании — сборник подпрограмм или объектов, используемых для разработки программного обеспечения, или ПО. Так гласит Википедия.
Давайте немного поясним. Правила структурного программирования говорят, что любая программа должна иметь структуру, а именно: делиться на взаимодействующие компоненты (блоки) — файлы, функции, классы.
Это можно сравнить с разделением книг на главы, абзацы, слова — без такого деления трудно понять смысл. Этот принцип — первый важный этап в понимании сущности библиотеки.
Следующий этап заключается в возможности использовать часть кода одной программы из другой программы. Обычно это нужно, чтобы повторно использовать код: не писать одно и то же два раза. А еще — не переписывать код, написанный на другом языке программирования. Такое свойство часто называют модульностью.
Самый простой контейнер для кода — функция. Часто используемые функции объединяются по своему типу в библиотеки. Например, функции по работе с видеофайлами, функции, отвечающие за соединение и получение информации из Интернета и т. д.
Библиотеки могут объединяться в более крупные сборники, в итоге иногда получаются настоящие монстры, относящиеся к какой-то широкой области. Например, OpenCV — это библиотека для компьютерного зрения, Django — для веб-программирования, Scipy — для научных вычислений.
В Python библиотеки называются модулями.
Итак, современный язык программирования напоминает наборы конструкторов, которые совместимы друг с другом.
Если вы программируете на Python, представьте себя ребенком, попавшим на огромный склад с конструкторами, где можно взять любой из них и делать с ним что угодно.
Именно так. Очень многие библиотеки абсолютно свободны (на их использование нет никаких ограничений), бесплатны, а их исходные коды доступны.
Обычно путают три понятия, связанные с ПО. Путаница получилась из-за того, что на английском free — и бесплатный, и свободный.
Свободное ПО означает, что после покупки вы можете делать с ним все, что хотите, включая дизассемблирование, использование в коммерческих проектах, написание на его основе своих программ
Бесплатное ПО
ПО с открытыми исходными кодами
Возможны любые сочетания этих свойств.
Некоторые библиотеки, например, связанные с математическими вычислениями, очень старые и написаны еще на Fortran. При этом они используются в современных проектах, поскольку созданы профессиональными математиками и инженерами, многократно проверены и оптимизированы.
В этом смысле библиотеки — такое же наследие человечества, как литература, музыка и архитектура.
Интересный факт: с точки зрения закона, программы являются литературными произведениями.
Репозиторий PyPI
PyPI — центральный репозиторий (хранилище) модулей для языка программирования Python. Он как PlayMarket для Android, AppStore для iPhone или CPAN для Perl. Пройдите по ссылке. Вы увидите страницу, которая начинается со следующих слов:
The Python Package Index (PyPI) is a repository of software for the Python programming language.
PyPI helps you find and install software developed and shared by the Python community.
Обратите внимание: количество модулей уже превысило 200 000!
Наверное, можно в шутку говорить, что у Python на все случаи жизни есть нужная библиотека.
Допустим, вы хотите написать программу-бота для «ВКонтакте», чтобы она делала за вас репосты, ставила лайки, переписывалась с друзьями, предлагала подружиться... Так вот для этого тоже есть библиотека!
Как работать с PyPI, мы изучим на следующем уроке, а пока разберемся со встроенными модулями.
Встроенные модули
Говорят, что Python поставляется уже с батарейками — даже стандартной библиотеки, входящей в комплект, уже достаточно для многих вещей.
Стандартной библиотеке посвящен целый раздел документации. Советуем вам хотя бы раз просмотреть его, чтобы примерно знать, какие вообще библиотеки бывают.
Модули в Python устроены по иерархическому принципу, как каталоги в файловой системе. Один модуль может быть вложен в другой, причем вложенность не ограничена (хотя на практике редко бывает больше 4). Чтобы пользоваться функциями, объектами и классами из модуля, весь этот модуль или его часть нужно подключить к программе — импортировать.
Возникает вопрос: а почему бы не подключить все библиотеки сразу? Можно, но это привело бы к нерациональному использованию оперативной памяти и очень долгой загрузке вашей программы.
Поэтому есть правило: не импортируйте то, чем не пользуетесь.
За импорт в Python отвечает директива import
.
Давайте посмотрим на примерах, как это происходит.
Теперь вам доступна переменная pi
. (В Python это значение приближенно равно 3,141592653589793).
Модуль, переменную, класс или функцию можно при импорте назвать своим именем — для этого служит ключевое слово as
, например:
Более того, поскольку в программе на языке Python в именах допустимы буквенные символы любых алфавитов, можно использовать даже греческие буквы (впрочем, это неудобно, если у вас кириллическо-латинская клавиатура).
Если нужно импортировать что-то с большей степенью вложенности, вам поможет символ ".", он выполняет ту же функцию, что и разные виды слешей в путях до файлов.
Мы можем импортировать всю библиотеку, но тогда для доступа к ее содержимому нужно снова использовать точку:
Или несколько точек. В любом случае аналогия с файловой структурой почти полная (объекты, функции и классы лежат в файлах, которые группируются в папки, которые тоже могут лежать в папках и т. д.).
Значения после директивы import можно писать через запятую:
Значок *
означает, что из библиотеки нужно импортировать все, что доступно.
Впрочем, так делать не рекомендуется, поскольку при таком подходе засоряется пространство имен.
Вспомните о двух полезных функций: dir
(возвращает список со всем содержимым объекта, модуля и т. д.) и help
(показывает справку об использовании данного объекта).
Обратите внимание: часть имен начинается с символа " _
". Это служебные имена, мы их пока рассматривать не будем, да и программисты ими пользуются редко.
«Пасхальные яйца» в Python
А импорт модуля с антигравитацией откроет в браузере комикс о том, что в Python действительно есть модули на все случаи жизни.
Модуль math
Давайте вернемся к встроенному модулю math и посмотрим внимательнее на то, какие возможности он нам предоставляет.
Мы писали программу для вычисления факториала числа, оказывается, такая функция уже есть:
Довольно часто применяется и функция gcd для нахождения наибольшего общего делителя:
Кроме того, есть функции для возведения в степень pow, которое принимает число, которое надо возвести в степень первым аргументом, а вторым аргументом — показатель степени, в которую надо возвести первый аргумент. А для извлечения квадратного корня числа есть функция math.sqrt
.
В Python есть встроенная функция pow
или **
, которая также возводит в степень, но есть ряд отличий. Например, math.pow всегда возвращает результат типа float
.
В модуль math встроены тригонометрические функции вычисления синуса, косинуса, тангенса и т. д.:
Обратите внимание: они принимают на вход значение угла в радианах, поэтому данные в градусах надо перевести в радианы с помощью функции модуля math
, которая называется radians. Существует и зеркальная функция degrees для перевода радиан в градусы.
Кроме того, math содержит ряд дополнительных интересных функций, например, знает теорему Пифагора. Функция hypot(a, b)
возвращает длину гипотенузы по двум катетам прямоугольного треугольника. Полный перечень функций и их описания можно посмотреть в документации.
Модуль random
Этот модуль предназначен для работы с псевдослучайными последовательностями. Такие последовательности важны в математическом моделировании, в криптографии и в различных играх.
Давайте посмотрим структуру модуля.
Как видим, довольно много функций. Давайте рассмотрим некоторые из них. Для получения одного псевдослучайного целого числа можно воспользоваться одной из двух функций: randrange
или randint
. Функция randrange
возвращает случайное число из диапазона. Как и в обычном range, мы можем указать начало, конец и шаг диапазона. Функция randint
работает похожим образом, но у нее границы диапазона — обязательные параметры, нельзя указать шаг, и верхняя граница включена в диапазон генерации.
Функция choice
Одна из самых популярных — функция choice
. С ее помощью можно выбрать один вариант из нескольких альтернатив, заданных в списке, кортеже, строке или любом другом индексируемом типе. choice
нельзя применять для неупорядоченных коллекций — например, множеств и словарей.
C некоторыми оговорками choice
можно использовать для словаря, но только в том случае, если ключи в нем такие же, как в списке: начинаются с нуля, целые числа, нет пропусков. Что в целом делает такой словарь несколько бесполезным.
А так — сымитировать несколько бросков игральных кубиков:
Если задать символы на сторонах кубика с использованием кодировки Unicodе, все будет еще реалистичнее.
Если попробовать вызвать choice
с пустой коллекцией, ваша программа упадет с ошибкой. Поэтому перед использованием этой функции будет нелишним проверять наличие в коллекции хотя бы одного элемента.
Если нам нужно вернуть не один, а несколько элементов, на помощь придут функции choiсes
и sample
. choices
возвращает заданное именованным параметром k
количество элементов с возможными повторами (коллекция должна быть непустой), sample
— без повторов, но выборка должна быть меньше или равна длине коллекции, иначе тоже будет ошибка.
Функция sample
Функция shuffle
Функция shuffle
перемешивает список, при этом меняется сам список, который передается как аргумент функции.
Функция random
А функция random
возвращает случайное вещественное число от 0 до 1 (не включительно):
Модуль datetime
Модуль datetime
предназначен для работы с датами и временем и предоставляет, кроме функций, несколько новых типов данных. Библиотека чаще всего применяется для того, чтобы узнать текущую дату или время:
Но ее можно использовать и для более интересных вещей, она предоставляет несколько интересных типов данных: time
, date
, datetime
— для хранения времени, даты и совместно даты и времени.
date
— тип для хранения даты. При создании новой даты нужно указать год, месяц и день. С помощью функции today()
можно узнать текущую дату на компьютере, а с помощью функции weekday()
— день недели (нумерация с 0).
time
— тип для хранения времени. При создании объекта данного типа надо указать час, минуту, секунду.
datetime
— тип для объединения даты и времени. Можно объединить date
и time
в один datetime
с помощью функции combine(date, time)
. Обратиться к отдельным частям объекта datetime
можно через точку и название части: например, year (аналогично можно поступить для date
или time
). С помощью функции now()
можно узнать текущее дату и время.
Тип timedelta
необходим для создания объектов, содержащих некоторый временной интервал. При создании таких объектов можно указать, сколько дней, часов, минут, секунд, недель содержит временной интервал. Как и с другими типами модуля datetime
, с частями временного интервала можно обращаться аналогично. С помощью функции total_seconds()
можно узнать длину интервала в секундах.
Интервал, в отличие от предыдущих типов, может быть отрицательным.
Для интервалов, дат, времени и типа datetime
поддерживаются математические и логические операции. Мы можем сложить два интервала времени, вычесть один из другого, увеличить интервал в n раз, уменьшить интервал в n
раз, а с помощью деления узнать, сколько раз один интервал помещается в другой.
К датам мы можем прибавлять временной интервал или удалять интервал для получения новой даты, которая раньше/позже на этот интервал. При вычитании одной даты из другой мы получим интервал времени между датами. С помощью логических функций мы можем узнать, какая дата позже (т. е. больше) или раньше (т. е. меньше).
Аналогичные действия работают и для datetime
.
Кроме того, для времени, даты и типа datetime
поддерживается форматированный вывод, который позволяет представлять информацию в удобном для нас виде.
Команда | Значение | Пример |
---|---|---|
%a | Аббревиатура дня недели | Sun, Mon, …, Sat (en_US);So, Mo, …, Sa (de_DE) |
%A | Полное название дня недели | Sunday, Monday, …, Saturday (en_US);Sonntag, Montag, …, Samstag (de_DE) |
%w | День недели как десятичное число, где 0 — воскресенье, а 6 — суббота | 0, 1, …, 6 |
%d | День месяца в формате из двух цифр | 01, 02, …, 31 |
%b | Аббревиатура месяца | Jan, Feb, …, Dec (en_US);Jan, Feb, …, Dez (de_DE) |
%B | Полное название месяца | January, February, …, December (en_US);Januar, Februar, …, Dezember (de_DE) |
%m | Номер месяца в формате из двух цифр | 01, 02, …, 12 |
%y | Последние 2 цифры года (год без века) | 00, 01, …, 99 |
%Y | Год полностью | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%H | Час в 24-часовом формате из двух цифр | 00, 01, …, 23 |
%I | Час в 12-часовом формате из двух цифр | 01, 02, …, 12 |
%p | AM или PM | AM, PM (en_US);am, pm (de_DE) |
%M | Минута в формате из двух цифр | 00, 01, …, 59 |
%S | Секунда в формате их двух цифр | 00, 01, …, 59 |
%f | Микросекунды в формате из 6 цифр | 000000, 000001, …, 999999 |
%j | День в году в формате из 3 цифр | 001, 002, …, 366 |
%U | Неделя в году | 00, 01, …, 53 |
%c | Принятое, согласно локальным настройкам, представление даты и времени | Tue Aug 16 21:30:00 1988 (en_US);Di 16 Aug 21:30:00 1988 (de_DE) |
%x | Принятое, согласно локальным настройкам, представление даты | 08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE) |
%X | Принятое, согласно локальным настройкам, представление времени | 21:30:00 (en_US);21:30:00 (de_DE) |
%% | Знак '%' | % |
Более подробно можно посмотреть в документации.
Модуль pprint
Модуль pprint
содержит функцию pprint
, которую удобно использовать при выводе сложных типов данных. pprint
старается вывести в консоль объекты в наиболее читабельном для человека виде. Ее особенно удобно использовать для вывода матриц.
pprint
работает и для словарей.
Мы рассмотрели только несколько встроенных библиотек — их намного больше. И у рассмотренных мы разобрали далеко не все функции. Пользуйтесь функциями dir
и help
и читайте документацию, в ней приведены примеры и объяснены нюансы.