f‑строки (форматированные строковые литералы) — один из самых удобных способов подставлять значения в текст в Python. Они появились в версии 3.6 и стали стандартом де‑факто для форматирования вывода: код становится короче и понятнее по сравнению с %-форматированием или методом .format(). В этой статье разберём, как правильно использовать f‑строки, какие возможности у них есть и какие ошибки чаще всего допускают. Всё — с примерами и практическими рекомендациями.
Что такое f‑строка и как её создать
f‑строка — это обычная строка с префиксом f (или F), внутри которой можно вставлять выражения в фигурных скобках {}.
name = "Анна" age = 27 message = f"Меня зовут {name}, мне {age} лет." print(message) # Меня зовут Анна, мне 27 лет.
Префикс обязателен: без него Python воспримет {name} как обычный текст.
message = "Меня зовут {name}" # просто строка, подстановки не будет
Возможности внутри фигурных скобок
В {...} можно писать не только имена переменных, но и любые выражения.
Вычисления
price = 199.9 discount = 0.1 final = f"Цена со скидкой: {price * (1 - discount):.2f} руб." print(final) # Цена со скидкой: 179.91 руб.
Доступ к элементам и атрибутам
user = {"name": "Борис", "role": "admin"} msg = f"Пользователь: {user['name']}, роль: {user['role']}" class Person: def __init__(self, name): self.name = name p = Person("Мария") msg2 = f"Имя: {p.name}"
Вызовы функций
def get_status(is_active): return "активен" if is_active else "неактивен" is_active = True msg = f"Статус: {get_status(is_active)}"
Форматирование чисел и дат
После выражения можно добавить спецификатор формата через двоеточие: {выражение:спецификатор}.
Числа: точность, выравнивание, разделители
value = 1234567.8912 # Фиксированное количество знаков после запятой f"{value:.2f}" # 1234567.89 # С разделителями тысяч (Python 3.6+) f"{value:,.2f}" # 1,234,567.89 # Выравнивание по ширине f"{value:>15.2f}" # справа, ширина 15 символов f"{value:<15.2f}" # слева f"{value:^15.2f}" # по центру
Проценты
ratio = 0.378 f"{ratio:.1%}" # 37.8%
Даты
from datetime import datetime now = datetime.now() # Стандартный формат f"{now:%Y-%m-%d %H:%M}" # 2026-07-31 14:22 # Любой свой формат f"{now:%d.%m.%Y}" # 31.07.2026
Многострочные f‑строки
Для длинных текстов удобно использовать тройные кавычки:
report = f""" Отчёт за {now:%Y-%m-%d} ----------------------- Пользователь: {user["name"]} Статус: {get_status(is_active)} Баланс: {value:,.2f} """ print(report)
Важно: префикс f ставится один раз перед открывающими тройными кавычками.
Пример использования:
python
from datetime import datetime def get_status(is_active: bool) -> str: return "Активен" if is_active else "Заблокирован" # Данные для отчёта now = datetime.now() user = {"name": "Иван Иванов"} is_active = True value = 1234567.89 # Многострочная f‑строка с тройными кавычками report = f""" Отчёт за {now:%Y-%m-%d} ----------------------- Пользователь: {user["name"]} Статус: {get_status(is_active)} Баланс: {value:,.2f} """ print(report)

Вложенные фигурные скобки и экранирование
Если нужно вывести сами символы { и }, их экранируют удвоением:
template = f"JSON-шаблон: {{\"name\": \"{name}\"}}" print(template) # JSON-шаблон: {"name": "Анна"}
Правило:
{→{{}→}}
Выражение внутри не должно содержать несбалансированных скобок.
Частые ошибки и как их избежать
1. Забыли префикс f
name = "Анна" msg = "{name}" # ошибка логики: будет выведено "{name}" msg = f"{name}" # правильно
2. Синтаксис внутри скобок
Нельзя писать произвольный код: только выражения, а не операторы.
# Нельзя: # f"Результат: {if x > 0: x else 0}" # SyntaxError # Можно (тернарный оператор): f"Результат: {x if x > 0 else 0}"
3. Неправильный спецификатор формата
x = "текст" # f"{x:.2f}" # TypeError: не может форматировать строку как float
Всегда проверяйте, что тип значения соответствует спецификатору.
4. Проблемы с кодировкой и спецсимволами
Внутри f‑строк работают обычные правила экранирования строк: \n, \t и т. д.
f"Строка 1\nСтрока 2"
Это не особенность f‑строк, но легко забыть при переносах строк в тройных кавычках.
5. Попытка использовать f‑строку в старых версиях Python
f‑строки работают начиная с Python 3.6. Если проект на 3.5 и ниже, они вызовут SyntaxError. В таких случаях используют .format() или %.
Практические примеры
Пример 1: простой отчёт по заказу
order_id = 1024 items = ["ноутбук", "мышь", "кабель"] total = 45990.5 report = f""" Заказ №{order_id} Товары: {", ".join(items)} Итого: {total:,.2f} руб. """ print(report)
Здесь:
- подстановка переменной,
- вызов метода
.join()внутри{}, - форматирование числа с разделителями и двумя знаками после запятой.
Пример 2: логирование с датой и уровнем
import logging from datetime import datetime now = datetime.now() level = "ERROR" message = "Не удалось подключиться к базе данных" log_line = f"[{now:%Y-%m-%d %H:%M:%S}] [{level}] {message}" logging.info(log_line)
Пример 3: формирование SQL‑запроса (только для демонстрации синтаксиса)
Важно: никогда не подставляйте пользовательский ввод напрямую в SQL через f‑строки — это уязвимость SQL‑инъекций. Ниже — пример только для синтаксиса f‑строк:
table = "users" column = "email" value = "anna@example.com" # НЕБЕЗОПАСНО, не используйте так в реальном коде query = f"SELECT * FROM {table} WHERE {column} = '{value}'"
Для реальных запросов всегда используйте параметризированные запросы (библиотеки sqlite3, psycopg2, SQLAlchemy и т. п.).
Сравнение с альтернативами
| Способ | Пример | Когда уместен |
|---|---|---|
| f‑строки | f"Привет, {name}" |
Почти всегда в современном Python |
.format() |
"Привет, {}".format(name) |
Если нужна совместимость с Python < 3.6 или специфическая логика шаблонов |
%‑форматирование |
"Привет, %s" % name |
Устаревший стиль; встречается в старом коде и логах |
Для новых проектов предпочтительны f‑строки.
Шпаргалка по форматам
:.2f— число с двумя знаками после запятой.:,.2f— то же, плюс разделители тысяч.:.1%— процент с одним знаком.:%Y-%m-%d— дата в формате ISO.:>10— выравнивание вправо, ширина 10 символов.:<10— влево.:^10— по центру.
