Зачем программе функции
Циклы автоматизируют повторение в потоке выполнения. Функции автоматизируют переиспользование поведения — и это не одно и то же.
Проблема, которую циклы не решают
В главе 12 наши проекты становились всё крупнее — и в них стали появляться повторяющиеся логические блоки. Например, в викторине один и тот же набор действий — «спросить вопрос, нормализовать ответ, сравнить, посчитать» — фактически повторяется на каждой итерации. Цикл (глава 10) отлично с этим справляется, пока повторение происходит подряд, в одном месте.
Но что, если тот же самый набор действий нужен:
- в разных местах программы — не подряд;
- с разными данными каждый раз;
- из разных проектов вообще;
- по требованию, а не по расписанию цикла?
Цикл здесь не поможет — он умеет повторять только то, что стоит прямо у него в теле. Нужен другой инструмент: способ дать этому действию имя и вызывать его откуда угодно.
Цикл vs функция
Функции — это декомпозиция
В главе 12 мы уже разбивали большую задачу на маленькие шаги — это называлось декомпозицией. Функция — это способ не просто мысленно выделить шаг, а буквально дать ему имя в коде:
Каждая функция — это осмысленное имя для одной части большего алгоритма.
Абстракция: полезный уровень детализации
Вы уже пользуетесь print(...), не думая о том, как именно
текст оказывается на экране. Точно так же вызов draw_house()
мог бы скрыть десятки команд рисования крыши, стен и окон:
draw_house(), а не КАК именно.Вы уже вызывали функции — с самой первой главы
print(), input(),
len(), type(),
int(), range(),
sorted(), min(),
max() — все они функции, просто встроенные в
Python. Всё это время вы их ВЫЗЫВАЛИ. Теперь научимся их СОЗДАВАТЬ:
| Встроенная функция | Ваша будущая функция |
|---|---|
len("Python") | calculate_area(10, 5) |
Общая модель одна и та же для обеих: