Перейти к содержимому
Теория · Модули, файлы и генераторы · урок 1 из 12

Модули и import

Чему вы научитесь

Чему вы научитесь:

  • подключать модули стандартной библиотеки тремя формами import;
  • отличать запуск файла от его подключения с помощью __name__;
  • сохранять данные в файл и в формат JSON, а потом читать их обратно;
  • получать значения по одному через итераторы и генераторы.
Ящик math переезжает с полки на верстак по стрелке import, внутри инструмент sqrt

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

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

Ящик ставят на верстак инструкцией import:

Python
import math

print(math.sqrt(16))  # 4.0
print(math.floor(2.7), math.pi > 3)  # 2 True

Давайте разберём пример по строкам:

  1. import math ставит на верстак ящик math: в программе появляется имя math.
  2. math.sqrt(16) достаёт из ящика функцию sqrt и считает корень из 16.
  3. 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 даёт модулю или функции другое имя. Обычно так сокращают длинное имя модуля. Все три формы в одной программе:

Python
from math import sqrt, floor
import statistics as st

print(sqrt(25), floor(-2.5))  # 5.0 -3
print(st.mean([2, 4, 9]))  # 5

floor округляет вниз, к меньшему целому, поэтому из -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.

Частая ошибка

Модуль подключили целиком, а функцию вызывают без его имени:

Python
import math

print(sqrt(16))  # ✗
TEXT
NameError: name 'sqrt' is not defined

import 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 и подпишись на канал — откроются все уроки.

Войти другим способом