Подпрограммы: процедуры и функции

Кусок программы получает имя, вход и выход — и дальше его зовут, а не переписывают. 10 класс, углублённый уровень — занятие десятое.

Уроки 19–20 плана, «Подпрограммы (процедуры и функции)», одной парой. В прошлый раз мы звали чужие функции из math и random. Сегодня пишем свои.

Чужие функции мы уже знаем

ВызовВходВыход
isqrt(50)числоцелый корень: 7
gcd(12, 18)два числаих НОД: 6
randint(1, 6)границыслучайное число

def: имя, параметры, return

def area(w, h):
    s = w * h
    return s

print(area(3, 5))

area — имя, w и h — параметры (вход), return s — выход.

return отдаёт значение в выражение

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

Откуда берётся None

def show(x):
    print(x * 2)

r = show(4)
print(r)
print(r + 1)

На экране 8 — это печатает сама show.

У каждой функции свои имена

x = 5
def f(x):
    x = x * 2
    return x

y = f(x)
print(x, y)

Внутри f своё x — параметр. Его удвоили, а внешнее x осталось 5. На экране 5 10.

return обрывает функцию сразу

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, и цикл дальше не крутится.

Функция из функций

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: одна проверенная функция становится кирпичом для следующей.

Три ошибки, которые даст Python

Что написалиЧто скажет Python
позвали функцию выше её defNameError — такого имени ещё нет
f(1, 2, 3) при def f(a, b)TypeError — не то число аргументов
print(c) снаружи, а c создана внутриNameError — локальная

Что делаем сегодня

  1. Тренажёр — шесть задач: что вернёт функция, процедура и функция, локальные имена, функция в цикле, какая строка упадёт, ранний return.
  2. Три программы, в каждой своя функция с оговорённым именем: digsum(n), is_prime(n), nod(a, b) и nok(a, b).
  3. Проверка оболочкой — Проверка.bat: девять наборов данных на программу, а потом оболочка зовёт твою функцию напрямую и смотрит, что она вернула.

Отметка: три задания — «5», два — «4», одно — «3». Попыток сколько угодно.

За работу

Сначала тренажёр, потом три программы.

Домашнее задание — на странице «Домашнее задание»: шесть типов задач на чтение функций, Python дома не нужен. В начале следующей пары — проверочная по этим же типам.

Материалы подготовлены с использованием технологий искусственного интеллекта. Пробел раскрыть и дальше · ← → слайды