Контракт небольшой операции
Функция объединяет действие с именем и параметрами. Она получает аргументы и возвращает результат через return.print показывает текст человеку, а return передаёт значение вызывающему коду. Функция без явного return возвращает None.
Опишите контракт до реализации: какие значения разрешены, меняет ли функция аргументы и что возвращает. Например, функция суммы списка принимает числа, не меняет список и возвращает число; пустому списку соответствует ноль. Такой контракт легко проверять независимо от чтения ввода.
Имена и изменяемость
Параметры и созданные внутри имена локальны. Если передан список, параметр связывается с тем же объектом: append изменит список вызывающего кода. Переприсваивание параметра другому списку не меняет прежнюю связь имени снаружи. Если изменение не нужно, создайте результат отдельно.Значение аргумента по умолчанию создаётся при определении функции, а не при каждом вызове. Поэтому items=[] может накопить значения между вызовами. Используйте items=None, затем создавайте список внутри. Сравнивать с None принято через is None.
Декомпозиция
Пусть одна функция вычисляет статистику, другая читает вход, третья оформляет ответ. Тогда вычисление можно тестировать на списке без терминала и файлов. Не создавайте функцию для каждой отдельной строки: выделяйте повторяемые действия или ясные границы ответственности.В примере два вызова без списка возвращают независимые результаты. Сначала создаётся новый список, затем добавляется значение. Если явно передать существующий список, изменение станет частью контракта; это необходимо объяснить пользователю функции.