Проверить программы онлайн · файлы остаются в браузере
10 класс, углублённый уровень. Занятие тринадцатое. Модуль — файл с
функциями, который подключают в любую программу: import и
from, защита if __name__ == "__main__", свои имена у
каждого модуля, импорт один раз, модуль внутри модуля.
Проверка.bat из общей папки: она запускает программу на девяти наборах
данных, смотрит, что модуль при импорте молчит и каждая его функция возвращает
верное, а программа берёт функции из модуля, а не пишет их заново. Интернет не нужен.
Шесть типов задач, по одной на каждый. В каждой задаче два-три файла: модуль (или
два) и main.py, который их подключает. Считать в уме или на
бумаге: иди по строкам запускаемого файла, а на строке import —
выполни файл модуля сверху вниз, если он ещё не загружен. Ответ — всё напечатанное
через пробел, или номер строки, о котором спрашивают. Ошибся — ниже появится разбор
рисунком: какая строка какого файла что сделала и что напечатала, — и кнопка «Новые
числа»: реши такую же ещё раз.
Имя модуля — имя файла без .py. Python ищет его сначала в папке
запущенной программы, потом в своей библиотеке. При import файл модуля
выполняется целиком: def запоминает функцию, а print,
если он стоит в модуле просто так, срабатывает сразу.
| Подключение | Как звать | Что появилось в программе |
|---|---|---|
import mytools | mytools.digsum(n) | имя mytools |
from mytools import digsum | digsum(n) | имя digsum, а mytools — нет |
import mytools as mt | mt.digsum(n) | имя mt |
from mytools import * | digsum(n) | все имена модуля |
Имя модуля пишется без .py: import mytools.py падает с
ModuleNotFoundError.
__name__ у запущенного файла — "__main__", у подключённого
— имя модуля. Поэтому блок под if работает, когда модуль проверяют сам по
себе, и молчит, когда его импортирует программа.
Функция ищет переменные в том модуле, где написана. k = 100 в программе
не меняет k модуля — это другая переменная. Изменить переменную модуля —
через точку: calc.k = 100. Своя def f в программе заменяет
импортированную f — поэтому функций с именами из модуля у себя не
заводят.
Первый import выполняет файл, следующие берут уже загруженный модуль —
сколько бы раз и откуда его ни подключали. Модуль может подключать модуль: если в
b.py стоит from a import f, у модуля b есть имя
f.
mytools.py, datetools.py,
zadanie1.py … zadanie3.py — в одну новую папку.
Программа находит модуль только рядом с собой.if __name__ == "__main__":. Модуль, который печатает при импорте или
ждёт input(), задание не сдаёт.def is_prime в самой
программе — задание не принято, даже если вывод верный.input(). Пиши input(), а
не input("Введите год: ") — вывод читает машина. возвращает сумму цифр натурального
;
возвращает
, если
простое, и
, если нет (0 и 1 — не простые). Обе — из пары 10. Внизу модуля —
проверки под
.
Проверяется: при импорте ничего не печатает; digsum на 0, 7, 10, 19, 909, 123456789; is_prime на 0, 1, 2, 3, 4, 9, 25, 29, 97, 1001, 7919.
—
, если год високосный: каждый
четвёртый, кроме кратных 100, но кратные 400 — снова високосные;
— сколько дней в месяце
года
. Обе — из пары 11.
пользуется
из того же модуля.
Проверяется: при импорте ничего не печатает; is_leap на 1900, 2000, 2024, 2025, 2100, 2400, 1996; days_in_month на всех месяцах и на феврале високосного и невисокосного года.
Программа читает в одной строке два натуральных числа
и
(1 ≤ a ≤ b ≤ 20000) и печатает, сколько на отрезке
от a до b простых чисел и сколько из них имеют простую сумму цифр. Функции —
и
из модуля
.
10 30
Простых чисел: 6 Из них с простой суммой цифр: 3
Проверяется: модуль mytools рядом; программа его подключает и своих digsum, is_prime не пишет; отрезки 1–1, 2–2, 1–30, 1–20000.
Первая строка — . Дальше цикл
: если
— плюс один к
простым, и если ещё
— плюс один ко второму
счётчику.
Ловушки. 1 — не простое, 2 — простое; граница входит.
is_prime перебирает делители до корня:
— иначе
двадцать тысяч чисел не успеют.
Программа читает две даты одного года — в первой строке
день и месяц первой, во второй — день и месяц второй (вторая не раньше первой), в
третьей строке год (1600–2400) — и печатает, сколько дней от первой даты до второй.
Функция
— из модуля
.
28 2 1 3 2024
Дней между датами: 2
Проверяется: модуль datetools рядом; программа берёт days_in_month из него; одна и та же дата, февраль 1900, 2000 и 2024 года, с 1 января по 31 декабря.
Номер дня в году — число плюс дни всех месяцев до этого:
для
от 1 до
. Ответ
— разность номеров второй и первой даты. Так же вы считали номер дня в паре 11 —
теперь функция приходит из модуля.
Дата счастливая, если сумма цифр дня плюс сумма цифр месяца — простое число:
29.02 → 2 + 9 + 2 = 13, счастливая. Программа читает год
(1600–2500) и печатает, сколько в нём счастливых дат. Функции берёт из обоих
модулей:
и
из
,
из
.
2025
Счастливых дат: 137
Проверяется: оба модуля рядом и подключены; своих функций программа не пишет; годы 2024, 2025, 1900, 2000 и случайные.
Два вложенных цикла: месяцы , в каждом дни от 1 до
включительно. Условие —
.
Ловушка. 29 февраля есть только в високосный год, и 1900 — не
високосный. Здесь и видна польза модуля: правило сотен живёт в одном месте —
в .
print из программ
убраны (в модулях они — под if __name__ == "__main__":).Проверка.bat.Оболочка показывает, на каких данных программа ошиблась и что должна была вывести, что модуль печатает при импорте, какая функция модуля что вернула и что должна была, и не написана ли функция заново в самой программе. Исправляй и проверяй снова, попыток сколько угодно. Отметка: три задания — «5», два — «4», одно — «3».
Модуль — файл .py с функциями. Имя модуля — имя файла без .py: import mytools. Файл лежит в папке программы. При import модуль выполняется целиком, сверху вниз.
import mytools — функции через точку: mytools.digsum(n). from mytools import digsum — просто digsum(n), но имени mytools нет. import mytools as mt — mt.digsum(n).
if __name__ == "__main__": — блок работает, только когда запускают сам модуль. У запущенного файла __name__ равно "__main__", у подключённого — имя модуля.
У каждого модуля своё пространство имён: функция видит переменные своего модуля. k = 100 в программе не меняет k модуля; calc.k = 100 — меняет.
Модуль выполняется при первом import, дальше берётся уже загруженный. Модуль может подключать модуль: что он импортировал, то у него и есть.
Программа делится на части с ясным назначением; каждую пишут и проверяют отдельно, а подключают, а не копируют. Своё не называют именами библиотеки: random.py рядом заслонит настоящий random.
Материалы подготовлены с использованием технологий искусственного интеллекта.