Встроенные модули
Говорят, что Python поставляется уже с батарейками — даже стандартной библиотеки, входящей в комплект, уже достаточно для многих вещей.

Стандартной библиотеке посвящен целый раздел документации. Советуем вам хотя бы раз просмотреть его, чтобы примерно знать, какие вообще библиотеки бывают.
Модули в Python устроены по иерархическому принципу, как каталоги в файловой системе. Один модуль может быть вложен в другой, причем вложенность не ограничена (хотя на практике редко бывает больше 4). Чтобы пользоваться функциями, объектами и классами из модуля, весь этот модуль или его часть нужно подключить к программе — импортировать.
Возникает вопрос: а почему бы не подключить все библиотеки сразу? Можно, но это привело бы к нерациональному использованию оперативной памяти и очень долгой загрузке вашей программы.
Поэтому есть правило: не импортируйте то, чем не пользуетесь.
За импорт в Python отвечает директива import.
Давайте посмотрим на примерах, как это происходит.
Теперь вам доступна переменная pi. (В Python это значение приближенно равно 3,141592653589793).
Модуль, переменную, класс или функцию можно при импорте назвать своим именем — для этого служит ключевое слово as, например:
Более того, поскольку в программе на языке Python в именах допустимы буквенные символы любых алфавитов, можно использовать даже греческие буквы (впрочем, это неудобно, если у вас кириллическо-латинская клавиатура).
Если нужно импортировать что-то с большей степенью вложенности, вам поможет символ ".", он выполняет ту же функцию, что и разные виды слешей в путях до файлов.
Мы можем импортировать всю библиотеку, но тогда для доступа к ее содержимому нужно снова использовать точку:
Или несколько точек. В любом случае аналогия с файловой структурой почти полная (объекты, функции и классы лежат в файлах, которые группируются в папки, которые тоже могут лежать в папках и т. д.).
Значения после директивы import можно писать через запятую:
Значок * означает, что из библиотеки нужно импортировать все, что доступно.
Впрочем, так делать не рекомендуется, поскольку при таком подходе засоряется пространство имен.
Вспомните о двух полезных функций: dir (возвращает список со всем содержимым объекта, модуля и т. д.) и help (показывает справку об использовании данного объекта).
['__doc__', '__loader__', '__name__', '__package__', '__spec__',
'acos', 'acosh','asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil',
'copysign', 'cos', 'cosh','degrees', 'e', 'erf', 'erfc', 'exp',
'expm1', 'fabs', 'factorial', 'floor','fmod', 'frexp', 'fsum',
'gamma', 'hypot', 'isfinite', 'isinf', 'isnan', 'ldexp','lgamma',
'log', 'log10', 'log1p', 'log2', 'modf', 'pi', 'pow', 'radians',
'sin','sinh', 'sqrt', 'tan', 'tanh', 'trunc']
```
```python linenums="1"
import math
help(math.sin)
Help on built-in function sin in module math:
sin(...)
sin(x)
Return the sine of x (measured in radians).
Help on built-in function radians in module math:
radians(...)
radians(x)
Convert angle x from degrees to radians.
Обратите внимание: часть имен начинается с символа _. Это служебные имена, мы их пока рассматривать не будем, да и программисты ими пользуются редко.
«Пасхальные яйца» в Python
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
...
А импорт модуля с антигравитацией откроет в браузере комикс о том, что в Python действительно есть модули на все случаи жизни.

Модуль math
Давайте вернемся к встроенному модулю math и посмотрим внимательнее на то, какие возможности он нам предоставляет.
Мы писали программу для вычисления факториала числа, оказывается, такая функция уже есть:
Довольно часто применяется и функция gcd для нахождения наибольшего общего делителя:
Кроме того, есть функции для возведения в степень pow, которое принимает число, которое надо возвести в степень первым аргументом, а вторым аргументом — показатель степени, в которую надо возвести первый аргумент. А для извлечения квадратного корня числа есть функция math.sqrt.
В Python есть встроенная функция pow или **, которая также возводит в степень, но есть ряд отличий. Например, math.pow всегда возвращает результат типа float.
В модуль math встроены тригонометрические функции вычисления синуса, косинуса, тангенса и т. д.:
Note
Они принимают на вход значение угла в радианах, поэтому данные в градусах надо перевести в радианы с помощью функции модуля math, которая называется radians. Существует и зеркальная функция degrees для перевода радиан в градусы.
Кроме того, math содержит ряд дополнительных интересных функций, например, знает теорему Пифагора. Функция hypot(a, b) возвращает длину гипотенузы по двум катетам прямоугольного треугольника. Полный перечень функций и их описания можно посмотреть в документации.
Модуль random
Этот модуль предназначен для работы с псевдослучайными последовательностями. Такие последовательности важны в математическом моделировании, в криптографии и в различных играх.
Давайте посмотрим структуру модуля.
['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random',
'SG_MAGICCONST', 'SystemRandom', 'TWOPI', '_BuiltinMethodType',
'_MethodType', '_Sequence', '_Set','__all__', '__builtins__',
'__cached__', '__doc__', '__file__', '__loader__','__name__',
'__package__', '__spec__', '_acos', '_ceil', '_cos', '_e', '_exp',
'_inst', '_log', '_pi', '_random', '_sha512', '_sin', '_sqrt',
'_test','_test_generator', '_urandom', '_warn', 'betavariate',
'choice', 'expovariate','gammavariate', 'gauss', 'getrandbits',
'getstate', 'lognormvariate','normalvariate', 'paretovariate',
'randint', 'random', 'randrange', 'sample','seed', 'setstate',
'shuffle', 'triangular', 'uniform', 'vonmisesvariate',
'weibullvariate']
Как видим, довольно много функций. Давайте рассмотрим некоторые из них. Для получения одного псевдослучайного целого числа можно воспользоваться одной из двух функций: 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 старается вывести в консоль объекты в наиболее читабельном для человека виде. Ее особенно удобно использовать для вывода матриц.
[[0, 12, 14, 7, 15, 10], [8, 18, 15, 5, 13, 14],
[15, 4, 14, 18, 17, 7], [11, 16, 19, 17, 14, 2],
[6, 13, 8, 17, 9, 14], [15, 10, 4, 5, 17, 9],
[16, 9, 14, 15, 13, 7], [12, 14, 9, 4, 7, 11],
[13, 18, 12, 3, 17, 15], [5, 18, 16, 17, 9, 6]]
[[0, 12, 14, 7, 15, 10],
[8, 18, 15, 5, 13, 14],
[15, 4, 14, 18, 17, 7],
[11, 16, 19, 17, 14, 2],
[6, 13, 8, 17, 9, 14],
[15, 10, 4, 5, 17, 9],
[16, 9, 14, 15, 13, 7],
[12, 14, 9, 4, 7, 11],
[13, 18, 12, 3, 17, 15],
[5, 18, 16, 17, 9, 6]]
pprint работает и для словарей.
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81,
10: 100, 11: 121, 12: 144, 13: 169, 14: 196, 15: 225, 16: 256,
17: 289, 18: 324, 19: 361}
{0: 0,
1: 1,
2: 4,
3: 9,
4: 16,
5: 25,
6: 36,
7: 49,
...
19: 361}
Мы рассмотрели только несколько встроенных библиотек — их намного больше. И у рассмотренных мы разобрали далеко не все функции. Пользуйтесь функциями dir и help и читайте документацию, в ней приведены примеры и объяснены нюансы.
Задачи
Задача 1
Напишите программу, которая считывает целое число n и выводит его факториал, используя модуль math.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 2
Напишите программу, которая считывает два целых числа a и b и выводит их наибольший общий делитель, используя модуль math.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 3
Напишите программу, которая считывает длину гипотенузы c и одного катета a, и вычисляет длину второго катета b. Используйте модуль math. Выводите результат с двумя знаками после запятой.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 4
Напишите программу, которая считывает угол в градусах и выводит значение синуса этого угла с 4 знаками после запятой. Используйте модуль math.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 5
Напишите программу, которая считывает целое число n и выводит n случайных целых чисел от 1 до 100 включительно — каждое на новой строке. Используйте random.randint.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 6
Напишите программу, которая считывает строку — список слов через пробел. Затем выводит одно случайно выбранное слово из этого списка. Используйте random.choice.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 7
Напишите программу, которая считывает дату в формате ГГГГ-ММ-ДД и выводит день недели на русском языке (Понедельник, Вторник, Среда, Четверг, Пятница, Суббота, Воскресенье). Используйте модуль datetime.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 8
Напишите программу, которая считывает две даты в формате ГГГГ-ММ-ДД и выводит количество дней между ними (всегда положительное число). Используйте модуль datetime.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 9
Напишите программу, которая считывает список слов через пробел и число n, затем выводит n уникальных случайно выбранных слов из списка (без повторений), каждое на новой строке. Используйте random.sample.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 10
Напишите программу, которая считывает дату рождения в формате ГГГГ-ММ-ДД и выводит полное количество лет, прошедших с этой даты по сегодняшний день, а также сколько дней осталось до следующего дня рождения. Используйте модуль datetime. Текущую дату получайте через dt.date.today().
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод: