Урок курса

Импорт модулей стандартной библиотеки

Python для новичков

В последних уроках мы разбирали строки и их методы — всё это встроено прямо в Python и доступно без дополнительных действий. Но у Python есть ещё один уровень готового кода: стандартная библиотека — сотни модулей, которые идут в комплекте с интерпретатором, но не загружаются автоматически. Чтобы ими воспользоваться, нужна одна инструкция.

Что такое модуль и зачем нужен import

Модуль — это обычный .py-файл, в котором кто-то уже написал полезный код: функции, константы, иногда классы. Когда вы устанавливаете Python, вместе с ним приходит стандартная библиотека — большой набор таких файлов. Там есть модуль для математики, для случайных чисел, для работы с датами, с путями файловой системы и ещё для десятков других задач. Всё это лежит на диске рядом с интерпретатором и не требует отдельной установки.

Но Python не загружает их все сразу при запуске программы. Это сделано намеренно: зачем держать в памяти инструменты, которые вам не нужны? Поэтому когда вы хотите использовать конкретный модуль, вы явно говорите об этом интерпретатору — инструкцией import.

Синтаксис простой:

import math
import random

Каждая из этих строк делает одно действие: Python находит файл модуля, выполняет его (то есть читает все определения внутри) и привязывает результат к имени в вашей программе. После import math имя math в вашем коде ссылается на этот загруженный модуль.

Важно понимать: import — это не копирование кода в ваш файл. Это подключение готового объекта, у которого есть своё содержимое. Как именно добраться до этого содержимого — разберём в следующем разделе.

Пространство имён и точечная нотация

После import math в вашей программе появляется имя math. Но что именно за ним стоит?

Представьте, что модуль — это ящик с инструментами. Внутри ящика лежат sqrt, pi, floor, ceil и ещё десятки вещей. Каждый инструмент подписан своим именем. Это и есть пространство имён модуля: отдельная область, в которой живут все имена, определённые в этом файле.

Когда вы пишете math.sqrt, вы буквально говорите: «возьми ящик math, открой его и достань оттуда sqrt». Точка — это оператор доступа к содержимому конкретного пространства имён.

Почему это важно? Представьте, что в вашем коде уже есть переменная с именем pi:

import math

pi = 3.14  # своя грубая константа

print(pi)       # 3.14 — ваша переменная
print(math.pi)  # 3.141592653589793 — константа из модуля

Оба имени существуют одновременно и не мешают друг другу. pi живёт в вашем коде, math.pi — в пространстве имён модуля. Точечная нотация явно указывает, из какого «ящика» брать имя.

Если бы Python просто вываливал все имена модуля прямо в ваш код при import math, такой манёвр был бы невозможен: одно из двух pi неизбежно перезаписало бы другое. Именно поэтому import math не делает sqrt и pi доступными напрямую — они остаются внутри своего пространства имён и требуют префикса.

Проверить, что вообще лежит в модуле, можно прямо в интерпретаторе:

import math
print(dir(math))

dir() вернёт список всех имён, определённых в math. Это удобнее, чем каждый раз открывать документацию, когда хочется вспомнить, есть ли там нужная функция.

Работа с модулями math и random: функции и константы

Теперь, когда понятно, как работает пространство имён, посмотрим на конкретные инструменты, которые даёт стандартная библиотека.

Модуль math

После import math доступны десятки математических функций и констант. Два самых часто используемых:

  • math.sqrt(x) — возвращает квадратный корень числа x. Результат всегда float, даже если корень целый: math.sqrt(16) даст 4.0, а не 4.
  • math.pi — это не функция, а константа. Её не нужно вызывать со скобками: просто math.pi возвращает 3.141592653589793.
import math

print(math.sqrt(25))   # 5.0
print(math.sqrt(2))    # 1.4142135623730951
print(math.pi)         # 3.141592653589793

# Площадь круга радиуса 5
radius = 5
area = math.pi * radius ** 2
print(area)            # 78.53981633974483

Обратите внимание: math.sqrt принимает ровно один аргумент. Передать отрицательное число нельзя — получите ValueError. Если нужны комплексные числа, для этого есть отдельный модуль cmath.

Модуль random

Этот модуль отвечает за псевдослучайные числа и случайный выбор. Две ключевые функции:

  • random.randint(a, b) — возвращает случайное целое из диапазона [a, b], оба конца включены. Это отличается от поведения range, где правая граница не входит.
  • random.choice(seq) — берёт случайный элемент из любой непустой последовательности: списка, строки, кортежа.
import random

# Бросок кубика
print(random.randint(1, 6))   # например, 4

# Случайный элемент из списка
options = ['камень', 'ножницы', 'бумага']
print(random.choice(options)) # например, 'ножницы'

# Случайный символ из строки
print(random.choice('Python')) # например, 'y'

Каждый запуск даёт новый результат — именно поэтому функции называются псевдослучайными. Если запустить этот код десять раз, randint будет возвращать разные числа в диапазоне от 1 до 6.

Как читать документацию

Когда нужна незнакомая функция из модуля, не нужно угадывать аргументы. Есть два быстрых способа:

  1. Вызвать help() прямо в интерпретаторе:
import math
help(math.sqrt)

Выведет сигнатуру функции и краткое описание.

  1. Открыть docs.python.org и найти нужный модуль в разделе «Library Reference».

Привычка смотреть в документацию, а не запоминать все аргументы наизусть — это нормальная инженерная практика. Даже опытные разработчики регулярно открывают help() для уточнения деталей.

Порядок вызова

Практический сценарий работы с любым незнакомым модулем выглядит так:

  1. Написать import имя_модуля в начале файла.

  2. Найти нужную функцию через help() или документацию.

  3. Вызвать её через точечную нотацию: модуль.функция(аргументы).

  4. Посмотреть на результат и убедиться, что тип возвращаемого значения тот, что ожидался.

Например, math.sqrt всегда возвращает float — если дальше нужен int, придётся явно привести тип: int(math.sqrt(16)). Это не ошибка библиотеки, это задокументированное поведение.

Форма from … import и типичные конфликты имён

До этого момента мы всегда писали import math и обращались к функциям через точку: math.sqrt, math.pi. Это безопасно и явно. Но Python предлагает ещё один способ — перенести конкретное имя прямо в ваше пространство имён:

from math import sqrt, pi

print(sqrt(25))  # 5.0 — без префикса math
print(pi)        # 3.141592653589793

После такого импорта sqrt и pi доступны напрямую, без math. перед ними. Это удобно, когда функция используется часто и префикс только загромождает код.

Можно импортировать и одно конкретное имя:

from random import choice

print(choice(['камень', 'ножницы', 'бумага']))

Остальное содержимое random при этом недоступно — только то, что вы явно указали в from … import.

Где это создаёт проблемы

Первая ловушка — конфликт имён. Когда вы пишете from math import sqrt, имя sqrt появляется в вашем пространстве имён. Если чуть ниже вы создадите переменную с тем же именем, она тихо перезапишет функцию:

from math import sqrt

sqrt = 'просто строка'  # перезаписали функцию

print(sqrt(16))  # TypeError: 'str' object is not callable

При import math такого не случилось бы: ваша переменная называлась бы sqrt, а функция оставалась бы доступной как math.sqrt — в разных пространствах имён они не мешали бы друг другу.

Вторая ловушка — имя вашего файла. Если вы назовёте файл math.py или random.py, Python при выполнении import math найдёт ваш файл раньше, чем стандартный модуль, и импортирует его. В вашем файле нет ни sqrt, ни pi — получите AttributeError в самом неожиданном месте.

# Файл называется math.py
import math
print(math.sqrt(9))  # AttributeError: module 'math' has no attribute 'sqrt'

Решение простое: никогда не называйте свои файлы так же, как модули стандартной библиотеки. Если уже случилось — переименуйте файл и удалите кеш __pycache__.

Когда что использовать

import math — надёжный вариант по умолчанию. Пространства имён не пересекаются, и из кода сразу видно, откуда пришла каждая функция.

from math import sqrt оправдан, когда функция используется многократно и вы уверены, что имя не будет переопределено в том же файле. В коротких скриптах это нормально; в больших проектах — лучше придерживаться точечной нотации.

Задача 1

Программист написал код:

from math import sqrt
print(sqrt(9))

Затем в том же файле ниже:

print(math.pi)

Что произойдёт при выполнении второй строки?

Выберите один вариант
Без регистрации · результат не сохраняется

Задача 2

Разработчик хочет вызывать randint(1, 6) без префикса random.. Какой вариант импорта это позволяет?

Выберите один вариант
Без регистрации · результат не сохраняется

Задача 3

Программист сохранил свой файл с именем random.py и написал в нём:

import random
print(random.randint(1, 10))

Что, скорее всего, произойдёт при запуске?

Выберите один вариант
Без регистрации · результат не сохраняется

Задача 4

Что выведет следующий код? Напишите вывод точно так, как он появится в терминале.

import math
result = math.sqrt(math.sqrt(256))
print(result)
Без регистрации · результат не сохраняется

Задача 5

Какое из утверждений о пространстве имён модуля верно?

Выберите один вариант
Без регистрации · результат не сохраняется

Задачи к уроку

Все задачи курса →

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку