f-строки в Python — форматирование строк для аналитика

Коротко

f-строка — строковый литерал с префиксом f, который подставляет значения переменных и выражений прямо в текст. Появились в Python 3.6 и стали стандартом форматирования. Аналитики используют f-строки для вывода метрик, логирования, формирования отчётов. На собеседованиях спрашивают синтаксис, форматирование чисел и подводные камни.

Синтаксис

name = 'Анна'
age = 28
f"Имя: {name}, возраст: {age}"
# 'Имя: Анна, возраст: 28'

Всё, что внутри {} — выражение Python. Оно вычисляется в момент создания строки и подставляется в результат.

Выражения внутри {}

Внутри фигурных скобок можно писать любое выражение: арифметику, вызовы функций, методы, тернарный оператор.

revenue = 1_500_000
users = 4200

f"ARPU: {revenue / users:.2f} руб."
# 'ARPU: 357.14 руб.'

f"Пользователей: {users:,}".replace(',', ' ')
# 'Пользователей: 4 200'

status = 'active'
f"Статус: {status.upper()}"
# 'Статус: ACTIVE'

score = 0.82
f"Тест {'пройден' if score >= 0.8 else 'не пройден'}"
# 'Тест пройден'

Форматирование чисел

Спецификация формата пишется после двоеточия внутри {}. Это самая полезная часть f-строк для аналитика.

conversion = 0.0347
revenue = 2_568_900.5
delta = -0.124

# Проценты
f"Конверсия: {conversion:.1%}"
# 'Конверсия: 3.5%'

# Два знака после запятой
f"Выручка: {revenue:,.2f}"
# 'Выручка: 2,568,900.50'

# Без дробной части с разделителем тысяч
f"Выручка: {revenue:,.0f} руб."
# 'Выручка: 2,568,900 руб.'

# Знак + для положительных и отрицательных
f"Изменение: {delta:+.1%}"
# 'Изменение: -12.4%'

Основные спецификаторы: :.2f — два знака после точки, :,.0f — разделитель тысяч без дробной части, :.1% — проценты с одним знаком, :+ — всегда показывать знак.

Форматирование дат

from datetime import datetime

now = datetime(2026, 4, 9, 14, 30)

f"Отчёт за {now:%d.%m.%Y}"
# 'Отчёт за 09.04.2026'

f"Обновлено: {now:%Y-%m-%d %H:%M}"
# 'Обновлено: 2026-04-09 14:30'

f"Месяц: {now:%B %Y}"
# 'Месяц: April 2026'

Форматные коды те же, что в strftime: %d — день, %m — месяц, %Y — год, %H:%M — часы и минуты.

Выравнивание и отступы

label = 'DAU'
value = 3200

f"{label:<10}: {value:>10,}"
# 'DAU       :      3,200'

f"{label:*^20}"
# '********DAU*********'

< — по левому краю, > — по правому, ^ — по центру. Число после символа — ширина поля. Символ перед <>^ — заполнитель (по умолчанию пробел).

Многострочные f-строки

metrics = {
    'dau': 3200,
    'revenue': 1_500_000,
    'conversion': 0.035
}

report = (
    f"DAU: {metrics['dau']:,}\n"
    f"Выручка: {metrics['revenue']:,.0f} руб.\n"
    f"Конверсия: {metrics['conversion']:.1%}"
)

Каждая строка — отдельная f-строка. Python склеивает их автоматически, если они в скобках. Можно использовать тройные кавычки (f"""..."""), но следите за лишними отступами.

Отладка с f"{var=}"

С Python 3.8 можно писать = после выражения — строка покажет и имя, и значение. Удобно для дебага.

users = 4200
retention = 0.42

f"{users=}, {retention=:.1%}"
# "users=4200, retention=42.0%"

f-string vs format() vs %

name = 'Анна'
score = 95.5

# f-строка — рекомендуемый способ
f"{name}: {score:.1f}"

# str.format()
"{}: {:.1f}".format(name, score)

# %-форматирование (устаревший)
"%s: %.1f" % (name, score)

f-строка — самый читаемый и быстрый вариант. format() нужен, когда шаблон строки определяется динамически (приходит из конфига или базы). %-форматирование — легаси, в новом коде не используйте.

Примеры для аналитика

Формирование лог-сообщений:

user_id = 12345
event = 'purchase'
amount = 990

f"[{datetime.now():%H:%M:%S}] user={user_id} event={event} amount={amount}"
# '[14:30:05] user=12345 event=purchase amount=990'

Динамические SQL-запросы — осторожно:

# ОПАСНО — SQL-инъекция!
table = "users"
query = f"SELECT * FROM {table} WHERE id = {user_id}"

# Так можно — только для имён таблиц/столбцов из доверенного источника
# Для значений всегда используйте параметризованные запросы:
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

Никогда не подставляйте пользовательский ввод в SQL через f-строки. Используйте параметризованные запросы или ORM.

Частые ошибки

Забытый префикс f. Самая коварная ошибка — строка выглядит как f-строка, но без f это просто текст с фигурными скобками:

name = 'Анна'
"{name}"    # '{name}' — просто строка
f"{name}"   # 'Анна' — f-строка

Обратный слэш внутри {}. В фигурных скобках нельзя использовать \. Вынесите в переменную:

# Ошибка в Python < 3.12 (в 3.12+ разрешено)
f"{'\\t'.join(items)}"

# Безопасный вариант для любой версии
sep = '\t'
f"{sep.join(items)}"

Вопросы с собеседований

Что такое f-строка в Python? — Строковый литерал с префиксом f, который подставляет значения выражений из фигурных скобок. Появился в Python 3.6. Выражения вычисляются в рантайме.

Как отформатировать число как проценты с двумя знаками?f"{value:.2%}". Спецификатор % умножает число на 100 и добавляет знак процента. .2 задаёт два знака после точки.

Чем f-строка отличается от str.format()? — f-строка вычисляется сразу, выражения пишутся прямо внутри строки. format() принимает аргументы отдельно. f-строка быстрее и читаемее, но format() нужен, когда шаблон определяется динамически.

Можно ли использовать f-строки для SQL-запросов? — Технически да, но для подстановки значений — нельзя. Это прямой путь к SQL-инъекции. Для значений используйте параметризованные запросы (%s, $1), f-строки допустимы только для имён таблиц/столбцов из доверенного источника.

Что делает = в f"{var=}"? — Выводит имя переменной и её значение. x = 5; f"{x=}" даст 'x=5'. Работает с Python 3.8+. Удобно для отладки.

Потренировать Python-вопросы на практике можно в тренажёре Карьерника. Больше тем — в гайде по lambda. А ещё больше примеров вопросов — на отдельной странице.

Открыть тренажёр в Telegram — вопросы по Python, pandas, SQL и аналитике. Бесплатно.

FAQ

f-строки работают в Python 2?

Нет. f-строки появились в Python 3.6 (PEP 498). В Python 2 используйте format() или %-форматирование. Но в 2026 году Python 2 — не аргумент, переходите на 3.

Можно ли вложить f-строку в f-строку?

Да, с Python 3.12 это работает без ограничений. В более ранних версиях нужно чередовать типы кавычек: f"{''.join(f'{x}' for x in items)}". Но если вложенность мешает читать — вынесите в переменную.

Какой способ форматирования самый быстрый?

f-строка. Она компилируется в байткод напрямую, без вызова метода. format() и % медленнее, потому что вызывают методы строки. Разница заметна на миллионах итераций, но в аналитическом коде обычно не критична.