v1.0.0

Python с нуля для ЕГЭ · Разбиваем программу на понятные части

Урок курсаPython 35 задачБесплатно

Разбиваем программу на понятные части

Научимся разделять ввод, вычисление и вывод между небольшими функциями с ясными контрактами.

Теория

Одна функция — одна ответственность

Обычно программа не становится большой за один раз. Сначала в ней появляется ввод, затем новое вычисление, повторяющийся поиск и сохранение. Когда фрагмент уже можно назвать человеческими словами, его удобно вынести в функцию.

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

def read_number():    return int(input()) def double(number):    return number * 2 value = read_number()print(double(value))

Как данные проходят между частями

Основная программа связывает функции в последовательность. Возвращённое значение первой части становится аргументом второй, а вывод происходит только после завершения вычисления.

При трассировке следуйте по значениям, а не прыгайте между всеми строками сразу: вход, результат первой функции, результат второй, вывод.

Разберём на примере
Проследим два вызова
read_number возвращает 6, затем вызывается double.
  1. Переменная value получает число 6.
  2. Вызов double получает 6 как параметр number.
  3. Функция возвращает 12, и только это число передаётся print.
Проверьте себя
Какой признак показывает, что часть программы стоит оформить отдельной функцией?
Эту часть можно ясно назвать, описать её вход и возвращаемый результат и проверить независимо от ввода или вывода.

Смешанные обязанности затрудняют проверку

Если функция одновременно спрашивает input, вычисляет и печатает, её трудно попробовать на заранее выбранном значении. Когда вычисление получает аргумент и возвращает результат, его можно спокойно проверить отдельно.

Как находить границы функций

Выпишите этапы решения обычными словами. Объединяйте команды, которые вместе дают один называемый результат, и передавайте этот результат следующей части.

Как действовать
Собираем программу
  1. Опишите вход и итог. Зафиксируйте формат данных и требуемый результат.
  2. Выделите вычисления. Каждая функция должна иметь понятный возвращаемый результат.
  3. Соедините вызовы. Передавайте данные явно через аргументы и return.
  4. Проверьте отдельно. Для вычислительных функций используйте маленькие готовые аргументы.

Практика

Назовите ответственность функции

Какая из функций должна преобразовывать введённые строки в числа: read_numbers, calculate_total или print_result?

Подсказка
Преобразование относится к получению и подготовке входных данных.
Решение

`read_numbers` отвечает за ввод и возвращает уже подготовленные числа. Вычисление и вывод тогда не зависят от формата ввода.

Проследите данные между функциями

read_number() возвращает 6, а double(x) возвращает x * 2. Чему равно double(read_number())?

Подсказка
Сначала выполняется внутренний вызов.
Решение

Первый вызов возвращает 6. Это значение становится аргументом double, который возвращает 12.

Соберите вычисление из частей

absolute(-3) возвращает 3, а square(3) возвращает 9. Что вернёт square(absolute(-3))?

Подсказка
Результат внутренней функции передаётся внешней.
Решение

absolute превращает -3 в 3, затем square вычисляет 3 * 3 = 9.

Не смешивайте вывод и вычисление

Функция calculate(value) должна отдавать число, но использует print(value * 2). Запишите корректную команду тела функции.

Подсказка
Результат вычисления нужно вернуть вызывающему коду.
Решение

`return value * 2` сохраняет разделение обязанностей: функция вычисляет, а печать выполняется отдельно.

Запустите программу из функций

add(a, b) возвращает сумму, double(x) — удвоенное значение. Чему равно double(add(2, 3))?

Подсказка
Сначала сложите 2 и 3.
Решение

add возвращает 5, затем double возвращает 5 * 2 = 10.

Итог

Теперь вы можете собирать программу из частей с ясным движением данных между ними.

Возьмите линейную программу из ввода, двух вычислений и вывода. Разделите её на функции и проверьте вычислительную часть без input.

Прогресс

0 / 5
x

Вы ещё не решали задания