До сих пор мы писали весь код в одном файле. Это удобно для маленьких программ, но что делать, когда проект разрастается до сотен или тысяч строк? Представьте, что вы пишете книгу: вы же не станете писать её на одной гигантской странице, верно? Вы разделите её на главы, разделы. В программировании для этого используют модули и пакеты.
Что такое модули?
Модуль в Python — это обычный файл с расширением .py, который содержит ваш код: функции, классы, переменные. Создали файл my_module.py? Он стал модулем с именем my_module.
Модули помогают:
- Организовать код. Разделяйте большую программу на логические части.
- Повторно использовать код. Напишите функцию или класс один раз и используйте их в разных частях проекта или даже в разных проектах.
- Избежать конфликтов имён. В разных модулях могут быть функции с одинаковыми именами, и это не вызовет проблем.
Импорт модулей: используем чужой и свой код
Чтобы использовать код из другого модуля, его нужно импортировать. Python предлагает много встроенных модулей (например, math для математики, random для случайных чисел), а также позволяет импортировать модули, созданные вами или другими разработчиками.
Как импортировать
-
import module_name: Импортирует весь модуль. Чтобы получить доступ к его содержимому, используйте префиксmodule_name..# Пример использования встроенного модуля math import math radius = 5 area = math.pi * radius**2 print(f"Площадь круга: {area}") # Пример использования встроенного модуля random import random random_number = random.randint(1, 10) # Случайное целое число от 1 до 10 print(f"Случайное число: {random_number}") -
import module_name as alias: Импортирует весь модуль, но позволяет дать ему короткое имя (псевдоним). Это удобно для длинных названий или для стандартизации.import math as m radius = 7 area = m.pi * radius**2 print(f"Площадь круга (с псевдонимом): {area}") -
from module_name import item1, item2: Импортирует только конкретные функции, классы или переменные из модуля. После этого их можно использовать без префиксаmodule_name..from math import pi, sqrt side1 = 3 side2 = 4 hypotenuse = sqrt(side1**2 + side2**2) # Используем sqrt напрямую print(f"Гипотенуза: {hypotenuse}") radius = 10 area = pi * radius**2 # Используем pi напрямую print(f"Площадь круга: {area}") -
from module_name import *: Импортирует всё содержимое модуля. Не используйте этот способ в больших проектах. Он может привести к конфликтам имён (если в разных модулях есть функции с одинаковыми названиями) и затрудняет понимание, откуда взялась та или иная функция.# НЕ РЕКОМЕНДУЕТСЯ для реальных проектов! from math import * print(f"Значение PI: {pi}") print(f"Корень из 25: {sqrt(25)}")
💡 Совет по импорту
Всегда старайтесь использовать
import module_nameилиfrom module_name import item. Это делает код яснее и помогает избежать конфликтов имён. Импорт всего модуля с псевдонимом (import module_name as alias) тоже хороший вариант, особенно для часто используемых модулей.
Создаём свои модули
Создать свой модуль очень просто! Достаточно сохранить Python-код в файле с расширением .py.
Давайте создадим простой модуль для геометрических расчётов.
Шаг 1: Создайте файл geometry.py
В том же каталоге, где будет ваш основной скрипт, создайте файл geometry.py со следующим содержимым:
# geometry.py
PI = 3.14159
def circle_area(radius):
"""Вычисляет площадь круга."""
return PI * radius**2
def rectangle_area(length, width):
"""Вычисляет площадь прямоугольника."""
return length * width
def triangle_area(base, height):
"""Вычисляет площадь треугольника."""
return 0.5 * base * height
print("Модуль geometry загружен!") # Это сообщение появится при первом импорте модуля
Шаг 2: Создайте основной скрипт main.py
Теперь создайте файл main.py в том же каталоге:
# main.py
import geometry
# Используем функции и переменные из нашего модуля geometry
radius = 5
print(f"Площадь круга с радиусом {radius}: {geometry.circle_area(radius)}")
length = 10
width = 6
print(f"Площадь прямоугольника {length}x{width}: {geometry.rectangle_area(length, width)}")
base = 7
height = 4
print(f"Площадь треугольника с основанием {base} и высотой {height}: {geometry.triangle_area(base, height)}")
# Можно импортировать конкретные функции
from geometry import circle_area
print(f"Площадь круга снова: {circle_area(8)}")
Шаг 3: Запустите main.py
Запустите main.py и увидите вывод:
Модуль geometry загружен!
Площадь круга с радиусом 5: 78.53975
Площадь прямоугольника 10x6: 60
Площадь треугольника с основанием 7 и высотой 4: 14.0
Площадь круга снова: 201.06176
Обратите внимание: строка "Модуль geometry загружен!" вывелась только один раз. Python кэширует импортированные модули, чтобы не загружать их повторно.
Что такое пакеты?
Когда модулей становится много, их можно объединить в пакеты. Пакет — это просто каталог, который содержит несколько модулей и специальный файл __init__.py. Файл __init__.py может быть пустым, но его наличие говорит Python, что этот каталог — пакет.
🚀 Зачем нужны пакеты?
Пакеты позволяют создавать иерархическую структуру для ваших модулей. Это делает код ещё более организованным и управляемым, что особенно важно для крупных проектов и библиотек.
Представьте, что мы хотим расширить наш модуль geometry и добавить расчёты для 3D-фигур. Мы можем создать пакет shapes:
my_project/
├── main.py
└── shapes/
├── __init__.py
├── two_d.py
└── three_d.py
В файле shapes/two_d.py будут функции для 2D-фигур (как в нашем geometry.py), а в shapes/three_d.py — для 3D-фигур.
Пример содержимого:
shapes/two_d.py:
# shapes/two_d.py
PI = 3.14159
def circle_area(radius):
return PI * radius**2
def rectangle_area(length, width):
return length * width
shapes/three_d.py:
# shapes/three_d.py
def cube_volume(side):
return side**3
def sphere_volume(radius):
return (4/3) * 3.14159 * radius**3
Импорт из пакета:
Теперь в main.py мы можем импортировать модули из пакета shapes так:
# main.py
import shapes.two_d
import shapes.three_d
# Используем функции из 2D-модуля
print(f"Площадь круга: {shapes.two_d.circle_area(6)}")
# Используем функции из 3D-модуля
print(f"Объем куба: {shapes.three_d.cube_volume(4)}")
# Или с использованием from...import
from shapes.two_d import rectangle_area
from shapes.three_d import sphere_volume
print(f"Площадь прямоугольника: {rectangle_area(5, 8)}")
print(f"Объем сферы: {sphere_volume(3)}")
Где Python ищет модули?
Когда вы импортируете модуль, Python ищет его в определённом порядке:
- В текущем каталоге (где запущен скрипт).
- В каталогах, указанных в переменной окружения
PYTHONPATH. - В стандартных каталогах установки Python (например,
site-packages, куда устанавливаются сторонние библиотеки).
Вы можете увидеть список путей, по которым Python ищет модули, с помощью модуля sys:
import sys
print(sys.path)
Практическое задание 🚀
- Создайте новый каталог для проекта, например,
my_project. - Внутри
my_projectсоздайте файлutils.pyсо следующими функциями:greet(name): принимает имя и выводит приветствие (например, "Привет, [имя]!").add_numbers(a, b): принимает два числа и возвращает их сумму.
- В том же каталоге
my_projectсоздайте файлapp.py. - В
app.pyимпортируйте функции изutils.pyи используйте их:- Вызовите
greet()с вашим именем. - Вызовите
add_numbers()с двумя числами и выведите результат.
- Вызовите
- Запустите
app.pyи убедитесь, что всё работает.
Модули и пакеты — это фундамент для создания любого нетривиального Python-приложения. Понимание того, как их создавать и использовать, критически важно для дальнейшего изучения более сложных тем, таких как объектно-ориентированное программирование, где классы часто организуются в модули и пакеты.