Проверить программы онлайн · файлы остаются в браузере

Модульный принцип — практикум

10 класс, углублённый уровень. Занятие тринадцатое. Модуль — файл с функциями, который подключают в любую программу: import и from, защита if __name__ == "__main__", свои имена у каждого модуля, импорт один раз, модуль внутри модуля.

План на пару. Сначала тренажёр: шесть коротких задач о том, как работают модули, — что напечатает импорт, какой файл запущен, чьё имя, импорт один раз, где программа упадёт, цепочка модулей. Потом два модуля из своих функций прошлых пар и три программы, которые их подключают. Проверяет оболочка Проверка.bat из общей папки: она запускает программу на девяти наборах данных, смотрит, что модуль при импорте молчит и каждая его функция возвращает верное, а программа берёт функции из модуля, а не пишет их заново. Интернет не нужен.

Часть 1. Тренажёр: как работают модули

Шесть типов задач, по одной на каждый. В каждой задаче два-три файла: модуль (или два) и main.py, который их подключает. Считать в уме или на бумаге: иди по строкам запускаемого файла, а на строке import — выполни файл модуля сверху вниз, если он ещё не загружен. Ответ — всё напечатанное через пробел, или номер строки, о котором спрашивают. Ошибся — ниже появится разбор рисунком: какая строка какого файла что сделала и что напечатала, — и кнопка «Новые числа»: реши такую же ещё раз.

0 верно из 6

Часть 2. Как устроены модули

Модуль — это файл

фрагмент программы — набери его сам фрагмент программы — набери его сам

Имя модуля — имя файла без .py. Python ищет его сначала в папке запущенной программы, потом в своей библиотеке. При import файл модуля выполняется целиком: def запоминает функцию, а print, если он стоит в модуле просто так, срабатывает сразу.

Четыре способа подключить

ПодключениеКак зватьЧто появилось в программе
import mytoolsmytools.digsum(n)имя mytools
from mytools import digsumdigsum(n)имя digsum, а mytools — нет
import mytools as mtmt.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.

Часть 3. Два модуля и три программы

Модуль mytools.py — функции для чисел

код возвращает сумму цифр натурального код; код возвращает код, если код простое, и код, если нет (0 и 1 — не простые). Обе — из пары 10. Внизу модуля — проверки под код.

Проверяется: при импорте ничего не печатает; digsum на 0, 7, 10, 19, 909, 123456789; is_prime на 0, 1, 2, 3, 4, 9, 25, 29, 97, 1001, 7919.

Модуль datetools.py — функции для дат

код — код, если год високосный: каждый четвёртый, кроме кратных 100, но кратные 400 — снова високосные; код — сколько дней в месяце код года код. Обе — из пары 11. код пользуется код из того же модуля.

Проверяется: при импорте ничего не печатает; is_leap на 1900, 2000, 2024, 2025, 2100, 2400, 1996; days_in_month на всех месяцах и на феврале високосного и невисокосного года.

Задание 1 Простые с простой суммой цифр

Программа код читает в одной строке два натуральных числа код и код (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 перебирает делители до корня: код — иначе двадцать тысяч чисел не успеют.

Задание 2 Дни между датами

Программа код читает две даты одного года — в первой строке день и месяц первой, во второй — день и месяц второй (вторая не раньше первой), в третьей строке год (1600–2400) — и печатает, сколько дней от первой даты до второй. Функция код — из модуля код.

Вход

28 2
1 3
2024

Вывод

Дней между датами: 2

Проверяется: модуль datetools рядом; программа берёт days_in_month из него; одна и та же дата, февраль 1900, 2000 и 2024 года, с 1 января по 31 декабря.

Если застрял

Номер дня в году — число плюс дни всех месяцев до этого: код для код от 1 до код. Ответ — разность номеров второй и первой даты. Так же вы считали номер дня в паре 11 — теперь функция приходит из модуля.

Задание 3 Счастливые даты

Дата счастливая, если сумма цифр дня плюс сумма цифр месяца — простое число: 29.02 → 2 + 9 + 2 = 13, счастливая. Программа код читает год (1600–2500) и печатает, сколько в нём счастливых дат. Функции берёт из обоих модулей: код и код из код, код из код.

Вход

2025

Вывод

Счастливых дат: 137

Проверяется: оба модуля рядом и подключены; своих функций программа не пишет; годы 2024, 2025, 1900, 2000 и случайные.

Если застрял

Два вложенных цикла: месяцы код, в каждом дни от 1 до код включительно. Условие — код.

Ловушка. 29 февраля есть только в високосный год, и 1900 — не високосный. Здесь и видна польза модуля: правило сотен живёт в одном месте — в код.

Часть 4. Сдача

  1. Пять файлов лежат в одной твоей папке, отладочные print из программ убраны (в модулях они — под if __name__ == "__main__":).
  2. В общей папке двойной щелчок по Проверка.bat.
  3. «Найти мои файлы» → «Проверить всё».
  4. Покажи учителю два экрана: тренажёр наверху этой страницы и итог оболочки.
Если вместо окна открылся текст программы — файл открылся в IDLE как код. Нажми F5, окно появится.

Оболочка показывает, на каких данных программа ошиблась и что должна была вывести, что модуль печатает при импорте, какая функция модуля что вернула и что должна была, и не написана ли функция заново в самой программе. Исправляй и проверяй снова, попыток сколько угодно. Отметка: три задания — «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.

Материалы подготовлены с использованием технологий искусственного интеллекта.