Урок курса
Импорт модулей стандартной библиотеки
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.
Как читать документацию
Когда нужна незнакомая функция из модуля, не нужно угадывать аргументы. Есть два быстрых способа:
- Вызвать
help()прямо в интерпретаторе:
import math
help(math.sqrt)
Выведет сигнатуру функции и краткое описание.
- Открыть docs.python.org и найти нужный модуль в разделе «Library Reference».
Привычка смотреть в документацию, а не запоминать все аргументы наизусть — это нормальная инженерная практика. Даже опытные разработчики регулярно открывают help() для уточнения деталей.
Порядок вызова
Практический сценарий работы с любым незнакомым модулем выглядит так:
Написать
import имя_модуляв начале файла.Найти нужную функцию через
help()или документацию.Вызвать её через точечную нотацию:
модуль.функция(аргументы).Посмотреть на результат и убедиться, что тип возвращаемого значения тот, что ожидался.
Например, 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
Какое из утверждений о пространстве имён модуля верно?
Задачи к уроку
- Импорт модулей стандартной библиотеки — задача по Python
randint(1, 10)) Что, скорее всего, произойдёт при запуске? Проверьте ответ в задаче из бесплатного курса Python.
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
