Форматирование строк

Иногда нужно напечатать строку, в которой присутствует пользовательский ввод. Например, напечатать "Привет, name", где name - это введённое пользователем имя.

Можно это сделать с помощью конкатенации строк, например:

name = input("Как вас зовут?")
print("Привет, " + name)

Однако, если строки станут сложнее, и подстановок станет больше, то выражение, получающееся при применении всех сложений, будет слишком громоздким.

Для облегчения подобных распространённых задач в Python существуют инструменты форматирования строк, аж целых 3.

Форматирование при помощи оператора %

Этот оператор форматирования - наследник форматирования строк из языка C, где были строковые подстановки. Если у нас один аргумент для подстановки, то через процент (так же, как и остаток от деления) пишется переменная для подстановки:

name = input("Как вас зовут?")
print("Привет, %s" % name)

Если несколько переменных - то подставлять нужно кортеж (список не подойдёт!) значений.

>>> print("Привет, %s, %d лет" % ("Вася", 35))
Привет, Вася, 35 лет

Спецификаторы преобразования (это те, что %s, %d и т.д.) записываются в следующем порядке:

  1. %
  2. Ключ отображения (необязательно), состоящий из последовательности символов в круглых скобках (например, (somename))
  3. Флаги преобразования
  4. Минимальная ширина поля
  5. Точность, начинается с '.', затем - желаемая точность
  6. Модификатор длины (опционально)
  7. Тип преобразования

Поясню каждый пункт подробнее.

  1. Есть возможность подставить словарь значений
>>> print("Привет, %(name)s, %(age)d лет" % {"name": "Вася", "age": 35})
Привет, Вася, 35 лет
  1. Это флаги, отвечающие за особое отображение чисел. В примере ниже мы отображаем знак числа
>>> print("Привет, %s, %+d лет" % ("Вася", 35))
Привет, Вася, +35 лет
  1. Минимальная ширина поля полезна для выравнивания
>>> print("Привет, %s, %3d лет" % ("Вася", 35))
Привет, Вася,  35 лет
>>> print("Привет, %s, %3d лет" % ("Вася", 100))
Привет, Вася, 100 лет
  1. Позволяет более точно управлять дробными значениями
>>> print("Привет, %s, %.2f лет" % ("Вася", 35 + 1/12))
Привет, Вася, 35.08 лет
>>> print("Привет, %s, %.4f лет" % ("Вася", 35 + 1/12))
Привет, Вася, 35.0833 лет
  1. Это про числа. Наследие C, где можно писать %ld для чисел типа long int; в Python игнорируется
  2. %s, %d - это так называемый тип преобразования (%s - строка, %d - целое число, %f - число с плавающей точкой)

Форматирование при помощи метода format

Вместо фигурных скобок в строку, к которой был применён метод format, подставляются значения аргументов

>>> print("Привет, {}, {} лет".format("Вася", 35))
Привет, Вася, 35 лет

Можно внутри фигурных скобок указывать номер аргумента:

>>> print("Привет, {1} лет, {0}".format("Вася", 35))
Привет, 35 лет, Вася

Можно указывать именованные аргументы:

>>> print("Привет, {name}, {age} лет".format(name="Вася", age=35))
Привет, Вася, 35 лет

Можно комбинировать номера и имена:

>>> print("Привет, {}, {age} лет".format("Вася", age=35))
Привет, Вася, 35 лет

Полную спецификацию метода format можно посмотреть здесь (англ.), но в целом там не очень много различий с оператором %, только все флаги записываются после двоеточия:

>>> print("Привет, {:10}, {age:.2f} лет".format("Вася", age=35.0833))
Привет, Вася      , 35.08 лет

И можно внутри выражения обращаться по индексу

>>> print("Привет, {}, {age[0]} лет, {age[1]} месяц(ев)".format("Вася", age=(35, 1)))
Привет, Вася, 35 лет, 1 месяц(ев)

f-строки

В Python версии 3.6 появился новый способ форматирования строк, а именно f-строки.

Почему f? Из-за способа задания. Как "сырые" строки задаются буквой r в начале, так f-строки задаются буквой f.

s = f"Это f-строка"

Значения в f-строку подставляются прямо в строке, в фигурных скобках. В качестве подстановки выступает выражение, внутри можно выполнить некоторый код.

Также после двоеточия можно записать флаги-модификаторы, как и в format:

name = "вася"
age = 35
months = 1
print(f"Привет, {name.title()}, {age} лет, {months} месяц(ев), всего {age + months / 12:.2f} лет")
# Привет, Вася, 35 лет, 1 месяц(ев), всего 35.08 лет