Большая задача — это несколько маленьких, и у каждой своё имя. 10 класс, углублённый уровень — занятие одиннадцатое, практическая работа.
Урок 21 плана — «Практическая работа по теме "Разработка подпрограмм"», урок 22 — резервное время: он уходит на четвёртую программу и доделку. В прошлый раз функция в задаче была одна. Сегодня их две: кирпич и функция, построенная из него.
Задача: сколько палиндромов среди чисел от a до b.
c = 0
for x in range(a, b + 1):
if is_pal(x):
c = c + 1
Пишем основную программу так, будто is_pal уже
есть. Получилось четыре строки, и они читаются как фраза.
is_pal(n) — это rev(n) == n, как
будто rev уже есть.
rev(n) — кирпич: цикл по цифрам, его
пишем честно до последней строки. Задача — подзадачи — кирпичи.| Функция | Принимает | Возвращает |
|---|---|---|
rev(n) | натуральное число | число задом наперёд: rev(120) → 21 |
is_pal(n) | натуральное число | True или False |
days_in_month(m, y) | месяц, потом год | число дней |
Имя, вход, выход — этого хватает, чтобы пользоваться, не
заглядывая внутрь. Как isqrt и gcd.
days_in_month(2024, 2) не упадёт: вернёт
31. Аргументы встают по порядку, а не по смыслу — порядок параметров
тоже часть договора.def f(x):
return x * 2 + 1
def g(x):
return x // 3
print(f(g(21)), g(f(21)))
Кто считается первым в f(g(21))?
Сначала аргумент: g(21) = 7, потом
f(7) = 15.
g(f(21)) — наоборот: f(21)
= 43, g(43) = 14. Порядок вызовов меняет ответ. На экране
15 14.def big(a, b):
if a > b:
return a
return b
def big3(a, b, c):
return big(big(a, b), c)
print(big3(40, 75, 12))
big3 сама ничего не сравнивает — она дважды зовёт
big.
Вызов big3 начался первым, а закончился
последним: внутри него — big(40, 75) → 75 и
big(75, 12) → 75.
print(rev(7), rev(120), rev(12321)) # 7 21 12321
print(is_pal(7), is_pal(10), is_pal(121)) # True False True
Берём крайние числа: однозначное, с нулём на конце,
самое большое. Проверил — убрал эти print.
def half(x):
print(x // 2)
def calc(x):
return half(x) + 1
print(calc(10))
half печатает 5 — и на этом её работа кончена.
calc, уходит None, и
None + 1 — TypeError в строке
return half(x) + 1.В if is_leap(y): печатающий кирпич не упадёт —
условие молча ложно. Кирпич, из которого строят дальше, обязан
return.
def calc(a):
return twice(a) + 1
def twice(a):
return a * 2
print(calc(5))
twice определена ниже calc. Это
ошибка?
def calc только запоминает тело.
Имя twice ищется, когда calc позвали, — а к
этому времени оно уже есть. На экране 11.print(calc(5)) выше
def twice — и NameError случится внутри
calc. Правило: все def выше первого вызова.def good(n):
return n % 7 == 0
def first(a, b):
for i in range(a, b + 1):
if good(i):
return i
return -1
print(first(30, 40), first(50, 54))
first спрашивает good про числа по порядку и
на первом «да» выходит.
first(30, 40): 30…34 — нет, 35 — да →
35. От 50 до 54 кратных 7 нет → после цикла −1.
else: return -1 внутри цикла ответит на
первом же числе: first(30, 40) даст −1.rev и is_pal, sumdiv и
is_abundant, sq_digits и
is_happy, is_leap и
days_in_month.Проверка.bat: девять наборов
данных на программу, потом оболочка зовёт каждую функцию
напрямую.Отметка: четыре задания — «5», три — «4», два — «3». Попыток сколько
угодно. Для этой пары — новая папка: в прошлой уже лежат свои
zadanie1.py.
Сначала тренажёр, потом четыре программы — по порядку.
Домашнее задание — на странице «Домашнее задание»: шесть типов задач на чтение программ из нескольких функций, Python дома не нужен. В начале следующей пары — проверочная по этим же типам.