Зачем заморачиваться в возвращении переменной, если можно просто не писать принт? объясните, я новичок

Попробуй эти оба варианта передать переменной:
a = maximum(2, 3)
print(a)
и увидишь чем они отличаются.
Функция предназначена чтобы возвращать, и она в любом случае будет что-то возвращать (ну по крайней мере питон без return хотя бы вернет None).
Другими словами: то что ты пересылаешь в одной из них данные print() - это не есть возвращение. Принт тоже функция, правда с другим назначением.
Кстати, функции которые ничего не возвращают - это процедуры
Вот пример когда без return не обойтись. Имеем функцию которая вычисляет среднее арифметическое. В дальнейших вычислениях дисперсии это значение нужно использовать в цикле несколько раз. С помощью return просто помещаем то что вернула функция в новую переменную и спокойно подсчитываем то что нужно

Можно делать и так, и так - как удобнее.
Проще уж возвращать переменную, чтобы использовать ее в дальнейших расчетах, или так же распечатать.
Ну и функция немного "безобразная"... Понятно, что питон с динамической типизацией и мы МОЖЕМ так делать, но ЛУЧШЕ, чтобы возвращаемые значения функции было какого-то одного типа
Этот оператор возвращает значение.
Отличие примеров в том, что в первом случае ты вызываешь функцию внутри принта. Оно вычисляет значение, возвращает его, принт печатает.
Во втором случае ты вызываешь функцию, она производит вычисления и сразу их печатает, никуда и ничего не возвращая.
Заморачиваться в возвращении переменной нужно потому, что не всегда конечной целью является вывод числа.
Ну, например, в библиотеке math есть функция log - вычисляет логарифм. Ты этот логарифм можешь использовать где-то дальше в расчетах, а не сразу выводить.
Оператор return завершает выполнение функции и возвращает управление вызывающей функции.