Форматирование строк в 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.