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

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

Как складывать между собой строки и не терять данные, как не получать ошибки? Как сделать код более читаемым? Конечно же научиться использовать форматирование строк!

Самым простым способом объединения строк является конкатенация, вот например:

name = "Игорь"
action = "напечатал число"
number = "7"

concatenation = name + action + number

print(concatenation)
# Выведет: Игорь напечатал число 7

Но что произойдет, если передать цифру 7 не строкой, а числом?

name = "Игорь"
action = "напечатал число"
number = 7

concatenation = name + action + number

print(concatenation)
# Выведет ошибку: TypeError: can only concatenate str (not "int") to str

Именно для таких случаев разработчики придумали форматирование строк. Итак...

Что такое форматирование строк и для чего оно нужно

Форматирование в Python — это способ создания строк с вставленными в них значениями переменных, выражений и других данных. Форматирование нужно для:

  • Упрощения работы с текстом: создания сообщений, отчетов и интерфейсов с динамически изменяемым содержимым строк.
  • Улучшения читаемости кода: форматирование строк делает код более понятным и легким для восприятия.
  • Предотвращения ошибок: Python автоматически обрабатывает типы данных, что снижает вероятность упустить какие-либо важные детали.
  • Локализации и интернационализации: форматированные строки легко адаптируются для различных языков и культур. Можно без проблем менять даты, время, валюту.

Существует несколько способов форматирования строк, давайте изучим их подробно ↓

%-форматирование

Это самый старый метод, пришедший в Python из языка С. % задает место, куда будет подставлено значение переменной. Получается синтаксис:

"Значение: %s" % переменная

Существует несколько вариантов использования:

  • Значения передаются по позициям:
name = "Костя"

print("Меня зовут %s." % name)
# Выведет: Меня зовут Костя.

# Давайте усложним задачу и добавим возраст
age = 35

print("Меня зовут %s. Мне %d лет." % (name, age))
# Выведет: Меня зовут Костя. Мне 35 лет.
  • Значения сопоставляются с именами ключей в словаре:
name = "Павел"
age = 17
dictionary = {"age": age, "name": name} 

print("Меня зовут %(name)s. Мне %(age)d лет." % dictionary)
# Выведет: Меня зовут Павел. Мне 17 лет.

Наверняка вы заметили, что где-то после знака % стоит s, а где-то d. Это очень просто объясняется, когда вы пишите:

  • s — вы добавляете строковое значение:
str = "это строка"

print("Это строка и %s" % str)
# Выведет: Это строка и это строка
  • d — вы добавляете целое десятичное число. Используется для тех моментов, когда значения в перемешку в строке, либо для выделения целой части из числа:
name = "Игнат"
age = 2.5

print("Меня зовут %s. И я %d года программирую на Python." % (name,age))
# Выведет: Меня зовут Игнат. И я 2 года программирую на Python.
  • c — помогает поставить символ Unicode:
# Давайте вставим сердечко в конец фразы - Я люблю тебя
heart = 9829

print("Я люблю тебя %c" % heart)

# Выведет: Я люблю тебя ♥
  • f — обозначает вещественный тип данных float. Его удобно использовать, когда нам нужно округлить число до требуемой точности, например:
num1 = 2.05375937583

print("Я сделал %.2f килограммов варенья." % num1)
# Выведет: Я сделал 2.05 килограммов варенья.

# Обратите внимание, что округление происходит по математическим правилам

num2 = 2.05775937583
print("Я сделал %.2f килограммов варенья." % num2)
# Выведет: Я сделал 2.06 килограммов варенья.

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

Метод format()

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

"Значение: {индекс}. Значение 2: {индекс}".format(переменная, переменная)

Фигурные скобки {} задают место для подстановки. Если вы оставите их пустыми, то значения будут передаваться из скобок  по порядку, начиная с нулевого индекса:

name = "Виктор"
age = 37
name_2 = "Владислав"
result = "Меня зовут {}. Мне сегодня исполнилось {} лет. У меня есть друг {}.".format(name, age, name_2)

print(result)
# Выведет: Меня зовут Виктор. Мне сегодня исполнилось 37 лет. У меня есть друг Владислав.

Вы также можете поменять порядок как вам угодно:

name = "Виктор"
age = 37
name_2 = "Владислав"
result = "Меня зовут {2}. Мне {1} лет. У меня есть друг {0}.".format(name, age, name_2)

print(result)
# Выведет: Меня зовут Владислав. Мне 37 лет. У меня есть друг Виктор.

* Этот метод совместим с старыми версиями Python (начиная с 2.6), а также выглядит более читаемым, когда имеется большое количество подстановок значений.

f-строка

Начиная с версии Python 3.6 можно использовать f-строки. Такие строки дают возможность в строку вшить и преобразовать в строковый тип данных переменные, различных типов данных. Синтаксис:

f"Значение: {переменная}"

Пример:

name = 'Костя'
num = 2
result = f"Меня зовут {name}. Я нашел работу программистом после обучения в Эльбрус Буткемп за {num} месяца."

print(result) 
# Выведет: Меня зовут Костя. Я нашел работу программистом после обучения в Эльбрус Буткемп за 2 месяца.

* Именно этот метод форматирования строк пользуется наибольшей популярностью.

Template-строки

Форматирование с помощью шаблонных строк происходит с использованием модуля string.Template:

t = Template("Значение: $value")
t.substitute(value=переменная)

Для примера создадим такую шаблонную строку:

# Для начала нужно импортировать сам модуль Template
from string import Template

name = "Иван"
count = 7
s = Template("Привет, я $name. У меня $count яблок.")

print(s.substitute(name=name, count=count))
# Выведет: Привет, я Иван. У меня 7 яблок.

* Использование шаблонов (templates) позволяет избежать некоторых проблем с безопасностью, таких как уязвимости, связанные с инъекциями кода. Это связано с тем, что метод template не выполняет никаких интерпретаций строк, содержащих специальные символы, такие как % или {}.

Полезные ссылки

Для того, чтобы узнать больше о методах работы со строками и подстроками читайте наши статьи Методы и функции строк в Python.Часть 1 и Часть 2.

Софья Пирогова

Софья Пирогова

Главный редактор / Автор статей