Использовать f-строки (formatted string literals):
name = "Alice"
age = 30
print(f"{name:>10}: {age:<5}")  # Выравнивание вправо, заполнение пробелами
Использовать метод .format():
name = "Bob"
age = 25
print("{:>10}: {:<5}".format(name, age))
Использовать str.ljust(), str.rjust(), str.center():
text = "Hello"
print(text.ljust(10))  # Выравнивание влево, заполнение пробелами
print(text.rjust(10))  # Выравнивание вправо, заполнение пробелами
print(text.center(10)) # Выравнивание по центру, заполнение пробелами
Для чисел можно указать количество знаков после запятой, ширину и заполнение:
pi = 3.14159
print(f"{pi:.2f}")      # 2 знака после запятой
print(f"{pi:06.2f}")    # Ширина 6, заполнение нулями, 2 знака после запятой
В Python есть несколько способов отформатировать вывод с отступом. Выбор зависит от ваших потребностей, но вот наиболее распространенные подходы:
Это современный и часто предпочтительный способ, появившийся в Python 3.6. Он позволяет встраивать выражения непосредственно в строку:
    name = "Alice"
    age = 30
    city = "New York"
    formatted_string = f"Имя: {name:>10}\nВозраст: {age:>10}\nГород: {city:>10}"
    print(formatted_string)
    # Вывод:
    # Имя:      Alice
    # Возраст:         30
    # Город:   New York
  
{name:>10} означает:  выровнять значение переменной name по правому краю в поле шириной 10 символов.< - выравнивание по левому краю.^ - выравнивание по центру.Можно также использовать символ-заполнитель:
    number = 42
    formatted_string = f"Number: {number:05}"
    print(formatted_string) # Output: Number: 00042
  Здесь :05 означает, что число будет дополнено нулями до 5 знаков, если оно меньше.
str.format()Это более старый, но все еще широко используемый способ форматирования строк:
    name = "Bob"
    score = 95
    formatted_string = "Имя: {:>10}\nОценка: {:>10}".format(name, score)
    print(formatted_string)
    # Вывод:
    # Имя:        Bob
    # Оценка:         95
  Синтаксис аналогичен f-строкам:  {:>10} означает выравнивание по правому краю в поле шириной 10 символов.
% (string formatting operator)Это самый старый метод, и его использование обычно не рекомендуется для нового кода, поскольку f-строки и str.format() более читабельны и гибки.  Однако его все еще можно встретить в старом коде:
    product = "Widget"
    price = 19.99
    formatted_string = "Продукт: %10s\nЦена: %10.2f" % (product, price)
    print(formatted_string)
    # Вывод:
    # Продукт:     Widget
    # Цена:       19.99
  
%10s означает строку, выровненную по правому краю в поле шириной 10 символов.%10.2f означает число с плавающей точкой, выровненное по правому краю в поле шириной 10 символов, с двумя знаками после запятой.textwrapМодуль textwrap полезен для форматирования длинных текстовых блоков. Он позволяет разбивать строки на строки заданной ширины и добавлять отступы.
    import textwrap
    long_text = """
    This is a very long string that needs to be wrapped and indented.
    It's important to format it correctly for readability.
    """
    wrapped_text = textwrap.fill(long_text, width=40, initial_indent='    ', subsequent_indent='    ')
    print(wrapped_text)
    # Вывод:
    #     This is a very long string
    #     that needs to be wrapped and
    #     indented.  It's important to
    #     format it correctly for
    #     readability.
  
textwrap.fill() разбивает текст на строки заданной ширины.initial_indent задает отступ для первой строки.subsequent_indent задает отступ для всех последующих строк.В простых случаях можно просто добавить пробелы в начало строки:
    message = "Hello, world!"
    indented_message = "  " + message  # Добавляем два пробела
    print(indented_message)  # Output:   Hello, world!
  Этот метод подходит для статических отступов, но не для динамического форматирования.
str.format():  Хороший выбор, если вы работаете с версиями Python до 3.6 или предпочитаете более явное форматирование.%:  Следует избегать в новом коде.textwrap:  Идеален для форматирования длинных текстовых блоков.