Ранее вы в основном работали с встроенными функциями Python. Это хороший старт, но когда вы начинаете задумываться о создании более сложных приложений — будь то игра, графический редактор вроде Paint, или даже простой калькулятор, — логика программы быстро становится запутанной.
Подумайте, как работает калькулятор. Вам нужно отобразить интерфейс, запрограммировать кнопки, обеспечить выполнение математических операций и учесть много других деталей. Как справиться с этой сложностью, не потеряв ясность в коде?
Ответ прост: используйте модули и библиотеки.
Официальная документация Python определяет модуль следующим образом:
Module — это объект, который служит организационной единицей кода Python. Модули имеют пространство имён, содержащее произвольные объекты Python. Они загружаются в программу посредством процесса импорта.
Если упростить, модуль — это файл с кодом, который можно подключить к другому файлу, чтобы не писать одно и то же заново.
Например, в одном из первых уроков вы создавали программы для вычисления различных математических функций. Представьте, что эти алгоритмы можно было бы выделить в отдельный модуль. Тогда, вместо того чтобы каждый раз переписывать код, вы просто импортировали бы этот модуль.
– И этот модуль можно использовать хоть сколько раз?
– Конечно! Это как библиотека книг. Представьте, что вы хотите приготовить что-то по рецепту. Вместо того чтобы заново придумывать рецепт, вы идёте в библиотеку, находите книгу с нужным рецептом и используете её. Модули работают так же.
Модули бывают трёх типов:
Стандартные модули
Эти модули поставляются вместе с Python. Например, модули для работы с файлами (os), выполнения математических операций (math) или управления временем (time). Их много, и они покрывают основные потребности разработчика.
Сторонние модули
Их создают другие разработчики для решения специфических задач, которые не входят в стандартный функционал Python. Например, модуль requests упрощает работу с веб-запросами, а numpy используется для сложных математических вычислений. Вы можете установить такие модули с помощью менеджера пакетов pip.
Пользовательские модули
Это модули, которые вы создаёте сами. Например, вы пишете программу, которая будет многократно использовать какую-то функцию. Вместо того чтобы копировать код в каждом файле, вы выносите эту функцию в отдельный модуль и подключаете его там, где нужно. Вы попробуете это на практике, когда начнёте изучать пользовательские функции.
Вы, вероятно, уже обратили внимание на три новых термина: модуль, фреймворк и движок. На первый взгляд, они кажутся схожими, и действительно, все эти понятия можно обобщить как «модули». Однако между ними есть важные отличия, которые стоит понять.
Отдельный файл (или набор файлов), содержащий код, предназначенный для выполнения определённой задачи. Обычно модули включают функции, классы и переменные, которые помогают решать конкретные проблемы и упрощают повторное использование кода.
Math, random, os, time
Вы импортируете модуль и вызываете нужные функции или классы. Например, math.sqrt(a) высчитывает корень числа a
Более масштабная структура, которая задаёт архитектуру вашего приложения. Он включает в себя библиотеки, инструменты и соглашения, которые помогают вам писать код в рамках определённой модели или подхода. По сути, фреймворк предоставляет «каркас», а вы добавляете в него свои «кирпичи» кода.
Django, Flask
Фреймворк определяет основные принципы работы вашего приложения. Например, в Django вы создаёте веб-приложение, следуя установленным правилам взаимодействия с базами данных, обработки запросов и рендеринга страниц. Ваш код интегрируется в структуру, предоставленную фреймворком.
Узкоспециализированное программное обеспечение, которое управляет определённой средой или выполняет сложные операции. В отличие от фреймворков, движки не определяют структуру всего приложения, а решают задачи, требующие больших вычислительных ресурсов или специфичных знаний.
pyGame, PyQt6, tkinter
Движок управляет своей специфической средой. Например, с помощью PyQt6 вы можете отрисовывать интерфейсные элементы, обрабатывать события и создавать полноценные графические приложения. Ваш код взаимодействует с движком, чтобы выполнять определённые действия в этой среде.
– А откуда их скачивать?
– Ну, до скачивания мы еще дойдем. Но если коротко - есть специальный пакетный менеджер python, который называется pip. Он встроен в python и с помощью него можно скачивать себе какие угодно модули. Ну и загружать в сеть собственные, в целом, тоже.
Погуглите популярные нынче модули. Для чего они необходимы? Где используются? Попробуйте также найти ответ на вопрос: почему, если есть движок для игр pygame, на нем почти не разрабатываются большие проекты?
В Python подключение модулей, фреймворков и движков устроено схожим образом. Мы не будем углубляться в использование сложных фреймворков или движков (это тема для отдельного раздела учебника), а сосредоточимся на работе с базовыми модулями.
Прежде чем использовать функции или переменные из модуля, его нужно импортировать. Это означает, что вы подключаете файл с кодом модуля к вашей программе.
Для этого используется отдельная команда import.
Работа с модулями в Python проста: вы вызываете функции модуля через его имя, используя точечную нотацию. Если это кажется сложным, начнём с основ.
Функции в Python условно делятся на два типа:
Обычные функции, такие как int(), print() или input().
Эти функции вы уже знаете и вызываете напрямую.
Методы, которые всегда привязаны к объекту.
Объектами могут быть строки, списки, экземпляры классов (это относится к ООП) или даже сам модуль.
<объект>.<метод>(<аргументы функции>)
<функция>(<аргументы функции>)
Метод sleep приостанавливает ход выполнения программы на n секунд.
Изучите сначала запись слева. Для вас оставила пример, как выглядит вызов метода и вызов функции.
Теперь посмотрите на то, как выглядит вызов метода в программе. Что тут происходит:
Импортируется модуль time
Теперь в программе доступен весь функционал модуля.
Вызывается метод sleep(5) из модуля time
Программа «засыпает» на 5 секунд.
После этого выполняется команда print(5)
Число 5 выводится на экран, но только после задержки в 5 секунд.
– То есть метод от функици отличается только записью?
– Именно так. Это удобно, ведь имена методов и функций могут пересекаться, да и есть другие причины для использования такой записи. Но если я начну это объяснять, придется объяснять принципы ООП, а там еще и функции пользовательские... Пока что просто запомни запись и все, потому что я намеренно буду говорить "Метод списка" например, и нужно уже понимать, о чем я говорю.
Попробуйте написать программу, которая выводит, например, стихотворение Блока "Ночь, улица, фонарь, аптека" (или любой другой текст), используя модуль time и метод sleep, чтобы оформить вывод интересно. Также я оставила для вас пример использования метода print с параметрами. Изучите этот код. Что делает end в нем? Используйте похожую запись у себя.
Когда вы работаете с модулем, необходимость постоянно указывать его имя для вызова функций может быть неудобной.
Python предоставляет способ импортировать отдельные функции, переменные или классы из модуля напрямую. Это позволяет обращаться к ним без префикса имени модуля.
Для этого используется конструкция
from <module> import <function>
Для импорта всех функций, переменных и классов из модуля используется звёздочка (*):
from <module> import *
❗Внимание! Импорт всех функций стоит использовать с осторожностью. Если в вашем коде уже есть функции с такими же именами, они будут перезаписаны.
Чтобы избежать конфликтов или сделать код более читаемым, вы можете переименовать функции или модули во время импорта с помощью ключевого слова as
Иногда вы не знаете, какие функции, переменные и классы есть в модуле. Python предоставляет удобный способ изучить содержимое модуля с помощью встроенной функции dir(), это выведет список всех доступных объектов в модуле math.
Также можно использовать функцию help() для получения справочной информации. Эта команда покажет описание модуля, включая документацию по каждой функции, что полезно для изучения новых модулей.
Создайте программу "test_random.py"
Импортируйте из модуля random функции randint, randrange. Используйте эти функции в переменных подобным образом.
a = randint(10, 100)
b = randrange(1, 10, 2)
И выведите их через print. Что они делают? Чтобы точно понять, запустите программу несколько раз.
После этого допишите программу так, чтобы она спрашивала у пользователя 2 числа и выводила случайное в этом диапазоне включая верхнюю границу.
Создание собственных модулей будет рассмотрено в главе 12