Кусок программы получает имя, вход и выход — и дальше его зовут, а не переписывают. 10 класс, углублённый уровень — занятие десятое.
Уроки 19–20 плана, «Подпрограммы (процедуры и функции)», одной парой. В
прошлый раз мы звали чужие функции из math и random.
Сегодня пишем свои.
| Вызов | Вход | Выход |
|---|---|---|
isqrt(50) | число | целый корень: 7 |
gcd(12, 18) | два числа | их НОД: 6 |
randint(1, 6) | границы | случайное число |
У каждой — имя, вход и выход. Как она устроена внутри, мы не знаем и знать не обязаны.
def area(w, h):
s = w * h
return s
print(area(3, 5))
area — имя, w и h —
параметры (вход), return s — выход.
def только запоминает функцию —
ничего не считает. Считать она начнёт при вызове.Вызов area(3, 5): аргументы 3 и 5 по
порядку встают в параметры — w = 3, h = 5.
return отдаёт 15 туда, где стоял вызов.
x = area(2, 4) + 1 # 8 + 1 = 9
if area(3, 3) > 5: # 9 > 5 — да
print("большая")
print(area(area(1, 2), 3)) # сначала area(1, 2) = 2, потом area(2, 3) = 6
Вызов внутри вызова считается первым: сначала аргументы, потом сама функция.
| Процедура | Функция | |
|---|---|---|
| что делает | делает: печатает, рисует | считает и отдаёт через return |
| что возвращает | None — «ничего» | число, True, False… |
| как зовут | строкой: show(5) |
в выражении: y = f(5) + 1 |
В Python обе пишутся через def. Разница — только
в return.
def show(x):
print(x * 2)
r = show(4)
print(r)
print(r + 1)
На экране 8 — это печатает сама show.
return нет, и функция
отдаёт «ничего». Его и положили в r.r + 1 — TypeError: к None
число не прибавить. Напечатанное нельзя использовать дальше — поэтому
считающая функция возвращает, а не печатает.x = 5
def f(x):
x = x * 2
return x
y = f(x)
print(x, y)
Внутри f своё x — параметр. Его удвоили, а
внешнее x осталось 5. На экране 5 10.
NameError.В параметр приходит копия числа. Нужно новое значение
снаружи — забери его: m = inc(m).
def is_prime(n):
if n < 2:
return False
d = 2
while d * d <= n:
if n % d == 0:
return False
d = d + 1
return True
Нашёлся делитель — ответ уже ясен: return False, и цикл
дальше не крутится.
return внутри цикла,
«не нашёл» — return после цикла.else: return True внутри
цикла. Функция ответит на первом же витке — и 9 станет «простым».def nod(a, b):
"""НОД — алгоритм Евклида."""
while b > 0:
t = a % b
a = b
b = t
return a
def nok(a, b):
return a // nod(a, b) * b
nok зовёт nod: одна проверенная функция
становится кирпичом для следующей.
help(nod) покажет её, как у math.isqrt в прошлый
раз.Функция, которая отвечает True или False, — признак:
if is_prime(x): читается как фраза.
| Что написали | Что скажет Python |
|---|---|
позвали функцию выше её def | NameError — такого имени ещё нет |
f(1, 2, 3) при def f(a, b) | TypeError — не то число аргументов |
print(c) снаружи, а c создана внутри | NameError — локальная |
digsum(n), is_prime(n), nod(a, b)
и nok(a, b).Проверка.bat: девять наборов
данных на программу, а потом оболочка зовёт твою функцию напрямую и
смотрит, что она вернула.Отметка: три задания — «5», два — «4», одно — «3». Попыток сколько угодно.
Сначала тренажёр, потом три программы.
Домашнее задание — на странице «Домашнее задание»: шесть типов задач на чтение функций, Python дома не нужен. В начале следующей пары — проверочная по этим же типам.