Модули и import
Чему вы научитесь:
- подключать модули стандартной библиотеки тремя формами
import; - отличать запуск файла от его подключения с помощью
__name__; - сохранять данные в файл и в формат JSON, а потом читать их обратно;
- получать значения по одному через итераторы и генераторы.

Представьте мастерскую. На верстаке лежат инструменты, которые нужны каждый день. Всё остальное разложено по ящикам на полках, и на каждом ящике написано, что в нём. Понадобился редкий инструмент — вы снимаете нужный ящик с полки и ставите его на верстак.
В Python всё устроено так же. Функции print, len и sorted лежат на верстаке: они доступны в любой программе сразу. Квадратный корень, случайные числа и чтение JSON лежат в ящиках на полке. Такой ящик называется модулем — это файл .py с готовыми функциями.
Ящик ставят на верстак инструкцией import:
import math
print(math.sqrt(16)) # 4.0
print(math.floor(2.7), math.pi > 3) # 2 TrueДавайте разберём пример по строкам:
import mathставит на верстак ящикmath: в программе появляется имяmath.math.sqrt(16)достаёт из ящика функциюsqrtи считает корень из16.math.floor(2.7)округляет вниз и даёт2, аmath.pi— число π из того же ящика.
Точка между именами читается как «из ящика math взять sqrt». Модули math, random, collections и json входят в стандартную библиотеку — они устанавливаются вместе с Python, и скачивать их не нужно.
Три формы import
Ящик можно поставить на верстак целиком, а можно достать из него только нужные инструменты. Разберём три формы по очереди.
import модуль
Строка import math даёт одно имя — math. Каждый вызов пишут через точку: math.sqrt, math.floor. Это самая частая форма: по записи math.sqrt сразу видно, откуда взялась функция.
from модуль import имя
Форма from … import, знакомая по классам данных, достаёт из модуля отдельные имена. Их пишут без имени модуля. После from math import sqrt в программе есть только sqrt, а имени math нет. Так удобно подключать имена, которые встречаются в программе часто.
import модуль as другое имя
Слово as даёт модулю или функции другое имя. Обычно так сокращают длинное имя модуля. Все три формы в одной программе:
from math import sqrt, floor
import statistics as st
print(sqrt(25), floor(-2.5)) # 5.0 -3
print(st.mean([2, 4, 9])) # 5floor округляет вниз, к меньшему целому, поэтому из -2.5 получается -3. Функция mean модуля statistics считает среднее арифметическое: сумма 15, делённая на 3 элемента, — это 5. Строка from random import choice так же даёт функцию choice, которая возвращает случайный элемент списка.
Этот вопрос часто задают на собеседовании: «Чем import math отличается от from math import sqrt?» Ответ: первая форма создаёт имя модуля, вторая — только имя функции.
Как выполняется модуль
Свой модуль — это любой файл .py. Допустим, рядом с программой лежит greet.py с функцией hello. Программа подключает его строкой import greet и вызывает greet.hello(). Имя модуля — это имя файла без .py.
Интерпретатор ищет модуль сначала в папке запущенной программы, а затем в стандартной библиотеке. При первом import он выполняет файл модуля сверху вниз и создаёт объект модуля.
Здесь аналогия с ящиком перестаёт работать. Настоящий ящик можно принести дважды и получить два ящика. Повторный import файл заново не читает и возвращает тот же объект: после import math и import math as m выражение m is math даёт True. Поэтому print вне функций в greet.py сработает один раз, сколько бы раз модуль ни подключали.
Модули собирают в пакеты. Пакет — это папка с модулями и файлом __init__.py, который может быть пустым. Модуль из пакета подключают через точку:
import shop.cartвыполняет файлshop/cart.py, и вызовы пишут черезshop.cart;from shop import cartдаёт короткое имяcart.
Частая ошибка
Модуль подключили целиком, а функцию вызывают без его имени:
import math
print(sqrt(16)) # ✗NameError: name 'sqrt' is not definedimport math создаёт только имя math, а sqrt остаётся внутри ящика. Напишите math.sqrt(16) или подключите функцию строкой from math import sqrt.
Главное
- Модуль — это файл
.pyс готовыми функциями, его подключают инструкциейimport. import mathдаёт имяmath,from math import sqrt— толькоsqrt, аasдаёт другое имя.- Файл модуля выполняется при первом
import, повторный возвращает тот же объект. - Пакет — это папка с модулями и файлом
__init__.py.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.