Некоторые среды разработки позволяют вывести содержимое переменной. Например, Jupyter или интерактивный интерпретатор питон. Но это не фича питона, это фича среды разработки. Упрощая, для каждого выражения среда выполняет примерно такой код:
result = введённое_тобой_выражение
if result is not None:
print(repr(result))
А вот способов преобразовать объект в строку в питоне и впрямь 2.
str(some_object) должно давать человеко-читаемое представление.
repr(some_object) должно (если можно) давать такое представление, которое описывает этот объект в синтаксисе питона.
Наглядный пример - строки.
print(str("foo\nbar")) напечатает
foo
bar
Тогда как print(repr("foo\nbar")) напечатает
"foo\nbar"
Но для многих объектов нет ни толкового str(), ни толкового repr(), так что оба представления совпадают.