Объяснение
Функция получает аргументы и возвращает значение через return. print только выводит текст. Контракт задаёт допустимые входы, результат и ошибки. Значение аргумента по умолчанию вычисляется при определении функции.
Задача для самостоятельного решения
Почему def add(x, items=[]): items.append(x); return items опасна?
Показать разбор ответа
Один список по умолчанию разделяется между вызовами. Используйте items=None и создавайте новый список внутри функции, если список не передан.