Функции в Python: зачем выносить код в def
Автор: Казачкин Даниил Михайлович · Обновлено
Определение def создаёт функцию, но не выполняет её тело. Код внутри запускается при каждом вызове. Функция даёт действию имя, изолирует детали и позволяет проверять один алгоритм на разных данных.
Один расчёт — несколько вызовов
def print_rectangle_area(width, height):
area = width * height
print(f'Площадь: {area}')
print_rectangle_area(3, 5)
print_rectangle_area(2, 8)Результат:
Площадь: 15
Площадь: 16Параметры width и height получают значения аргументов отдельно для каждого вызова. Пустые строки между определением и остальным кодом не обязательны для выполнения, но делают модуль читабельнее.
Определить до вызова
Python выполняет файл сверху вниз. Если вызвать функцию до того, как интерпретатор дошёл до def, возникнет NameError. Тело может обращаться к параметрам и локальным переменным; случайная зависимость от глобального имени делает функцию сложнее проверять.
Эта функция печатает результат, но не возвращает его. Поэтому выражение total = print_rectangle_area(3, 5) сохранит None. Следующий урок разберёт return. Пока различайте побочный эффект печати и значение вычисления.
Выделение повторяющегося шага
Создайте функцию print_greeting(name), которая выводит персональное приветствие и длину имени. Вызовите её для трёх имён, включая одно из двух букв. Затем намеренно удалите отступ у второй команды и прочитайте ошибку или изменившееся поведение. Для проверки спросите себя: какие данные функция получает, какие команды повторяет и что появляется в консоли при одном вызове.
Функция как единица проверки
Вынесите преобразование температуры из Цельсия в Фаренгейты в функцию без input и print. Внешний код отвечает за ввод и оформление. Проверьте функцию через assert для 0, 100 и -40, где обе шкалы совпадают. Затем намеренно используйте глобальную переменную вместо параметра и покажите, как второй тест получает зависимость от чужого состояния. Верните явный параметр и повторите проверки. Хорошая учебная функция выполняет одну операцию, получает всё необходимое через аргументы и допускает проверку без имитации пользовательского сеанса.
Практикум: чистая функция преобразования времени
Напишите to_minutes(hours, minutes), которая возвращает общее число минут и не читает ввод. Зафиксируйте допустимые значения минут от 0 до 59 и поведение для отрицательных часов. Проверьте (0, 0), (1, 30) и границы минут. Отдельная оболочка получает пользовательский ввод и печатает ответ. Затем используйте функцию три раза в одной программе без копирования формулы. Изменение текста вывода не должно затрагивать вычисление, а тесты вызывают функцию напрямую.
Контрольная точка
Назовите вход, выход и побочные эффекты функции. Если она печатает число вместо return, почему вызывающий код не сможет надёжно сложить два результата?
Частые вопросы
Функция обязана иметь return?
Нет, но без явного return она возвращает None. Процедура может выполнять побочное действие, однако вычислительная функция обычно полезнее, когда отдаёт результат вызывающему коду.