Глава 13 · Автоматизация с помощью функций

Зачем программе функции

Циклы автоматизируют повторение в потоке выполнения. Функции автоматизируют переиспользование поведения — и это не одно и то же.

Проблема, которую циклы не решают

В главе 12 наши проекты становились всё крупнее — и в них стали появляться повторяющиеся логические блоки. Например, в викторине один и тот же набор действий — «спросить вопрос, нормализовать ответ, сравнить, посчитать» — фактически повторяется на каждой итерации. Цикл (глава 10) отлично с этим справляется, пока повторение происходит подряд, в одном месте.

Но что, если тот же самый набор действий нужен:

Цикл здесь не поможет — он умеет повторять только то, что стоит прямо у него в теле. Нужен другой инструмент: способ дать этому действию имя и вызывать его откуда угодно.

Цикл vs функция

ПОВТОРИТЬсейчасПОВТОРИТЬсейчасПОВТОРИТЬсейчас
Цикл: один поток повторяющегося выполнения
draw_square(определена одинраз)ВЫЗОВоткуда угодноВЫЗОВоткуда угодноВЫЗОВоткуда угодно
Функция: определена один раз, вызывается по требованию
Не альтернативы, а дополнение друг друга
Циклы автоматизируют повторение в потоке выполнения. Функции автоматизируют переиспользование поведения. Совсем скоро мы увидим, как функция вызывается ИЗНУТРИ цикла — они прекрасно работают вместе, а не вместо друг друга.

Функции — это декомпозиция

В главе 12 мы уже разбивали большую задачу на маленькие шаги — это называлось декомпозицией. Функция — это способ не просто мысленно выделить шаг, а буквально дать ему имя в коде:

ВИКТОРИНАshow_question()показать вопросcheck_answer()проверить ответshow_result()показать результат
Большая задача → части с понятными именами — это и есть декомпозиция в коде

Каждая функция — это осмысленное имя для одной части большего алгоритма.

Абстракция: полезный уровень детализации

Вы уже пользуетесь print(...), не думая о том, как именно текст оказывается на экране. Точно так же вызов draw_house() мог бы скрыть десятки команд рисования крыши, стен и окон:

draw_house()один вызовдесятки командрисования внутри
Вызов прячет детали реализации за понятным именем
Абстракция — не «спрятать всё», а выбрать полезный уровень детализации
Абстракция означает, что мы можем пользоваться осмысленной операцией, не думая каждый раз о каждой детали её реализации. Это не значит, что детали недоступны или неважны — просто для большинства задач достаточно знать ЧТО делает draw_house(), а не КАК именно.

Вы уже вызывали функции — с самой первой главы

print(), input(), len(), type(), int(), range(), sorted(), min(), max() — все они функции, просто встроенные в Python. Всё это время вы их ВЫЗЫВАЛИ. Теперь научимся их СОЗДАВАТЬ:

Встроенная функцияВаша будущая функция
len("Python")calculate_area(10, 5)

Общая модель одна и та же для обеих:

ИМЯ + АРГУМЕНТЫВЫЗОВРЕЗУЛЬТАТ /ЭФФЕКТ
Имя функции + аргументы → вызов → результат или эффект — для встроенных функций и ваших собственных одинаково
Практика: цикл или функция — что решает задачу
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →