Короткий ответ
В современном Python 3 предпочтительны f-строки (f"{value}") как наиболее читаемый и быстрый способ; метод .format() остаётся полезен, когда шаблон строки определяется динамически или отдельно от значений, а оператор % считается устаревшим стилем, доставшимся от Python 2.
Как это работает подробнее
f-строка вычисляет выражения внутри {} непосредственно в месте использования и вставляет их строковое представление (с учётом опциональных спецификаторов формата после :). .format() подставляет аргументы в именованные или позиционные {}-плейсхолдеры шаблонной строки, которую можно хранить отдельно от значений. % использует printf-подобный синтаксис (%s, %d) и требует соответствия типов плейсхолдерам.
Пример кода
example.py
name = "Мария"
balance = 1234.5
print(f"Пользователь {name}, баланс: {balance:.2f} руб.")
print("Пользователь {}, баланс: {:.2f} руб.".format(name, balance))
template = "Привет, {user}! У вас {count} новых сообщений."
print(template.format(user=name, count=3))Что использовать на практике
- Практика. f-строки предпочтительны почти везде, где шаблон и значения известны в одном месте кода — они короче и быстрее на выполнение.
.format()удобен, когда шаблон читается из конфигурации или файла локализации и заранее не содержит реальных переменных Python. Спецификаторы формата ({value:.2f},{num:,}) работают одинаково и в f-строках, и в.format().
Подводные камни
- Риски. Используют конкатенацию строк (
"Привет, " + name + "!") для сложных сообщений вместо f-строк, что менее читаемо и подвержено ошибкам с типами (нельзя конкатенировать str и int без явного приведения). Также забывают, что в f-строках нельзя использовать обратный слэш внутри выражения в{}(ограничение зависит от версии Python).