ilnaz
А вот где и как это можно применить?
Модуль обычно отвечает за что-то. Например, модуль math отвечает за математические операции типа sin(), cos(), sqrt(). Не везде эти операции нужны, поэтому все они собраны в отдельном модуле, который их объединяет по их назначению и держит отдельно. В тех программах, где они нужны, модуль math просто импортируется, и таким образом функции из него становятся доступны в программе. А в тех программах, где они не нужны, ничего не импортируется и для программы эти операции как бы не существуют. Но модуль math нельзя запустить сам по себе, его можно только импортировать. Но есть модули, которые можно как импортировать, так и запустить сами по себе - например, модуль timeit или unittest. Если ты их импортируешь, то тебе становятся доступны классы из них - например, timeit.Timer() или unittest.TestCase(). Но если ты их запустишь напрямую, то timeit позволяет замерять время выполнения кода, а unittest может обнаруживать файлы с тестами в текущем каталоге и выполнять их. Когда же ты пишешь свой модуль, он точно так же должен соответствовать правилам формирования модуля - нести какую-то одну функцию (предназначение) и объединять внутренние структуры чем-то. При этом сам по себе он может выполнять конкретные действия, а при импортировании его содержимое можно использовать для многих других программ, которые к его конкретным действиям не имеют отношения.