F-строки в Python: как вставить переменную и отформатировать число

Чтобы подставить переменную в текст, поставьте f перед кавычками и возьмите переменную в фигурные скобки.

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

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3000 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3654 экспертных мнения Подписаться на Телеграм-канал
Обложка: F-строки в Python: как вставить переменную и отформатировать число

Чтобы вставить переменную в текст, поставьте букву f перед кавычками, а саму переменную заключите в фигурные скобки: f"Мне {age} лет". Python подставит значение в момент выполнения строки. Внутри скобок работает любое выражение: арифметика, вызов метода, условие. После двоеточия задаётся формат: два знака после запятой, разделитель разрядов, ширина колонки.

Ниже синтаксис, таблица спецификаторов и ошибки, на которых чаще всего ломается код. Вывод в примерах получен в Python 3.14, а где 3.11 ведёт себя иначе, это отмечено. Если нужны остальные операции со строками (разрезать, заменить, убрать пробелы), они собраны в шпаргалке по методам строк в Python.

CheckroiCheckroiПодборка курсов по Python568 курсов • 51 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Как написать f-строку

Рой вставляет имя в строку текста на экране редактора кода
  1. Поставьте f или F прямо перед открывающей кавычкой, без пробела.
  2. Внутри строки напишите в фигурных скобках имя переменной или выражение.
  3. Выведите результат через print() или сохраните в переменную: f-строка превращается в обычную строку str.
name = "Анна"
age = 28
print(f"Меня зовут {name}, мне {age} лет")
print(F"Через год будет {age + 1}")

Вывод:

Меня зовут Анна, мне 28 лет
Через год будет 29

F-строки появились в Python 3.6, их описывает PEP 498. Подходят одинарные, двойные и тройные кавычки, тройные нужны для текста в несколько строк.

Префикс f сочетается с r: в строке rf"C:\Users\{name}" обратный слеш остаётся слешем, а {name} подставляется. Если вы только начинаете и ещё не запускали свой первый код, сначала пригодится разбор Hello World на Python.

Что можно писать в фигурных скобках

Любое выражение, которое возвращает значение. В справочнике языка сказано, что выражения внутри f-строки вычисляются во время выполнения, слева направо, в том месте программы, где стоит строка.

price = 1490
qty = 3
user = {"name": "Олег", "city": "Казань"}
items = ["кофе", "чай", "какао"]
print(f"Итого: {price * qty} ₽")
print(f"Имя заглавными: {user['name'].upper()}")
print(f"Товаров в корзине: {len(items)}")
print(f"Доставка: {'бесплатно' if price * qty >= 3000 else '290 ₽'}")

Вывод:

Итого: 4470 ₽
Имя заглавными: ОЛЕГ
Товаров в корзине: 3
Доставка: бесплатно

Что здесь сработало:

  • арифметика: {price * qty};
  • метод строки: {user['name'].upper()};
  • вызов функции: {len(items)}, свою функцию тоже можно, как её написать, рассказано в статье про функции в Python;
  • условие в одну строку: это тернарный оператор, внутри f-строки он читается нормально, пока короткий.

Пустые скобки {} дают ошибку. Присваивание через := и lambda внутри поля справочник требует брать в круглые скобки: {(half := 1/2)}.

Кавычки внутри скобок до и после Python 3.12

В Python 3.12 сняли многие ограничения на выражения в f-строках (PEP 701). Теперь внутри скобок можно повторить ту же кавычку, что снаружи, поставить обратный слеш и даже комментарий. Тот же код в Python 3.11 падает:

user = {"name": "Олег"}
print(f"Привет, {user["name"]}!")

Вывод в Python 3.11:

SyntaxError: f-string: unmatched '['

Решение для 3.11 и более ранних версий: внутри скобок берите другой тип кавычек, f"Привет, {user['name']}!". Так код работает в любой версии, начиная с 3.6.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Форматирование чисел: знаки после запятой, разряды, проценты

Карточки с числами выровнены по правому краю в аккуратные колонки

После выражения ставится двоеточие, за ним спецификатор. Это тот же мини-язык формата, что у метода format(), поэтому всё из таблицы работает в обоих способах.

Спецификатор Что делает Пример Результат
:.2f два знака после точки f"{3.14159265:.2f}" 3.14
:, запятая между разрядами f"{1250000:,}" 1,250,000
:_ подчёркивание между разрядами f"{1250000:_}" 1_250_000
:.1% доля в процентах, один знак f"{0.0753:.1%}" 7.5%
:03 нули слева до ширины 3 f"{7:03}" 007
:+ знак плюс у положительных f"{5:+}" +5
:b, :x, :#x двоичная и шестнадцатеричная запись f"{255:#x}" 0xff
pi = 3.14159265
salary = 1250000
share = 0.0753
print(f"{pi:.2f}")
print(f"{salary:,}")
print(f"{salary:_}")
print(f"{share:.1%}")
print(f"{7:03}")
print(f"{255:b} {255:x} {255:#x}")

Вывод:

3.14
1,250,000
1_250_000
7.5%
007
11111111 ff 0xff

Двоичную и шестнадцатеричную запись подробнее разбирает статья про системы счисления в Python.

Пробел между разрядами, как принято в русском тексте

Готового спецификатора для пробела нет. Тип n берёт разделитель из текущей локали, но на сервере и у вас на компьютере локаль может отличаться. Предсказуемее отформатировать запятыми и заменить их:

salary = 1250000
print(f"{salary:,}".replace(",", " "))

Вывод:

1 250 000

Формат меняет только вид числа, само значение в переменной остаётся прежним. Если нужно именно округлить число для расчётов, смотрите разбор округления в большую сторону.

Выравнивание и ширина колонки

Символ после двоеточия задаёт направление, число за ним задаёт ширину поля в символах:

  • < прижимает текст влево;
  • > прижимает вправо, для чисел это вариант по умолчанию;
  • ^ ставит по центру;
  • символ перед стрелкой заполняет пустое место, без него будут пробелы.
rows = [("Python", 1250000), ("Java", 980000), ("Go", 70500)]
for lang, total in rows:
    print(f"{lang:<10}|{total:>12,}|")
print(f"{'итого':^24}")
print(f"{'стоп':*^12}")
width = 8
print(f"[{'abc':>{width}}]")

Вывод:

Python    |   1,250,000|
Java      |     980,000|
Go        |      70,500|
         итого          
****стоп****
[     abc]

Ширину можно взять из переменной: вложенное поле {width} внутри формата подставится раньше, чем Python начнёт выравнивать. Так удобно печатать отчёты в консоль, когда ширина колонки зависит от самого длинного названия.

Даты в f-строке

Для даты и времени после двоеточия пишутся те же коды, что в методе strftime(). Их полный список есть в документации модуля datetime.

from datetime import date, datetime
d = date(2026, 10, 20)
t = datetime(2026, 10, 20, 15, 7)
print(f"{d:%d.%m.%Y}")
print(f"{t:%H:%M}")
print(f"{d}")

Вывод:

20.10.2026
15:07
2026-10-20
  • %d, %m, %Y: день, месяц и год из четырёх цифр;
  • %H:%M: часы и минуты в 24-часовом формате;
  • без формата дата выводится в виде ГГГГ-ММ-ДД, как в последней строке.

Отладка: знак равенства и флаг !r

С Python 3.8 после выражения можно поставить знак =. F-строка выведет и само выражение, и его значение, так что подписывать переменные в print() вручную больше не нужно. Пробелы вокруг = сохраняются в выводе, а после него можно добавить формат.

total = 4470
items = ["кофе", "чай"]
print(f"{total=}")
print(f"{total = :,}")
print(f"{len(items)=}")
word = "кофе "
print(f"[{word}]")
print(f"{word!r}")

Вывод:

total=4470
total = 4,470
len(items)=2
[кофе ]
'кофе '

Флаг !r показывает значение так, как его видит Python, вместе с кавычками. На нём сразу видно лишний пробел в конце строки, из-за которого не срабатывает сравнение с "кофе". Убрать такой пробел поможет метод strip(). Флаг !s даёт обычный вывод, !a заменяет кириллицу и другие не-ASCII символы escape-последовательностями вроде \u043a.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

F-строка, format() или %: что выбрать

В Python три встроенных способа подставить значение в текст. Результат у всех одинаковый:

name, total = "Анна", 4470.5
print("%s заплатила %.2f ₽" % (name, total))
print("{} заплатила {:.2f} ₽".format(name, total))
print(f"{name} заплатила {total:.2f} ₽")
template = "{name}: {total:.2f} ₽"
print(template.format(name="Олег", total=990))

Вывод:

Анна заплатила 4470.50 ₽
Анна заплатила 4470.50 ₽
Анна заплатила 4470.50 ₽
Олег: 990.00 ₽
Способ Как выглядит Когда уместен
Оператор % "%s: %.2f" % (name, total) старый код и сообщения модуля logging
Метод format() "{}: {:.2f}".format(name, total) шаблон хранится отдельно от данных: в настройках, в файле перевода
F-строка f"{name}: {total:.2f}" почти всё остальное

По скорости разница незаметна. В Python 3.14 миллион таких строк через timeit собрался за 0,12 с у f-строки и у % и за 0,14 с у format(). Разница около 20 наносекунд на строку. Выбирайте по читаемости.

В logging значения лучше передавать аргументами: logging.info("Заказ %s", order_id). В руководстве по logging сказано, что форматирование аргументов сообщения откладывается до момента, когда без него не обойтись. F-строка собирается сразу, в момент выполнения строки кода, даже если запись потом отбросит фильтр уровня. Не путайте этот % с оператором остатка от деления: для чисел это арифметика, для строки слева это форматирование.

В Python 3.14 появились t-строки с префиксом t (PEP 750). Синтаксис у них как у f-строк, но результат не строка, а объект Template: текст и подставленные значения в нём хранятся раздельно, пока их не соберёт ваш код. По замыслу авторов, на этом можно строить безопасную сборку SQL, HTML и команд оболочки. Для обычного вывода по-прежнему хватает f-строк.

Частые ошибки и что с ними делать

Рой с лупой находит лишнюю фигурную скобку в строке кода

Забыли букву f

Python не ругается, а печатает скобки как есть: Привет, {name}. Если в выводе видны фигурные скобки с именем переменной, первым делом проверьте префикс.

Нужна фигурная скобка в самом тексте

Решение: удвойте её. {{ и }} выводятся как одна скобка.

name = "Анна"
print(f"{{name}} = {name}")
print("Привет, {name}")

Вывод:

{name} = Анна
Привет, {name}

Ошибка Unknown format code у строки

Текст ошибки: Unknown format code 'f' for object of type 'str'. Формат :.2f работает только с числами. Чаще всего число пришло строкой из input():

price = input("Цена: ")   # ввели 1490
print(f"{price:.2f}")

Вывод в Python 3.14:

ValueError: Unknown format code 'f' for object of type 'str'

Решение: переведите значение в число через float(price). Как безопасно читать числа с клавиатуры, разобрано в статье про int(input()) и проверку ввода.

SyntaxError в Python 3.11 и раньше

В версиях до 3.12 внутри скобок нельзя ставить обратный слеш и ту же кавычку, что снаружи: разрешили их только в 3.12, это отмечено в справочнике языка. Код ниже в 3.14 печатает список по строкам, а в 3.11 не запускается:

items = ["кофе", "чай"]
print(f"Список:\n{'\n'.join(items)}")

Вывод в Python 3.11:

SyntaxError: f-string expression part cannot include a backslash

Решение: соберите строку заранее, text = "\n".join(items), и подставьте готовую переменную {text}.

Округление «не туда»

Выражение f"{2.675:.2f}" даёт 2.67, а не 2.68. Число 2.675 хранится в памяти как двоичная дробь 2.67499999…, и формат округляет именно её. Для денег берите Decimal:

from decimal import Decimal, ROUND_HALF_UP
price = 2.675
print(f"{price:.2f}")
exact = Decimal("2.675").quantize(Decimal("0.01"), ROUND_HALF_UP)
print(f"{exact}")

Вывод:

2.67
2.68

Запрос к базе данных, собранный f-строкой

Значение, которое ввёл пользователь, может закрыть кавычку и дописать в запрос своё условие. Документация sqlite3 велит всегда подставлять значения через плейсхолдеры, а не строковым форматированием, чтобы избежать SQL-инъекций. Пример на временной базе:

import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE users(name TEXT, city TEXT)")
con.executemany("INSERT INTO users VALUES(?, ?)", [("Анна", "Казань"), ("Олег", "Пермь")])
city = "' OR '1'='1"
bad = f"SELECT name FROM users WHERE city = '{city}'"
print(con.execute(bad).fetchall())
good = con.execute("SELECT name FROM users WHERE city = ?", (city,)).fetchall()
print(good)

Вывод:

[('Анна',), ('Олег',)]
[]

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

Где освоить Python системно

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

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

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 011 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 666 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽ - 17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Что означает f перед строкой в Python?

Это префикс форматированной строки. Python вычисляет выражения в фигурных скобках и подставляет их значения в текст: f"Мне {age} лет" превратится в «Мне 28 лет». Вместо f можно писать заглавную F.

С какой версии Python работают f-строки?

С Python 3.6. Отладочный знак =, как в f"{x=}", добавили в 3.8, а повторять внешние кавычки и ставить обратный слеш внутри фигурных скобок можно с Python 3.12.

Как вывести число с двумя знаками после запятой?

Поставьте после переменной двоеточие и спецификатор .2f: f"{price:.2f}". Формат меняет только вид числа, значение в переменной остаётся прежним. Остальные спецификаторы собраны в таблице в разделе про форматирование чисел.

Как вставить фигурные скобки в f-строку?

Удвойте их: f"{{name}}" выведет {name} как обычный текст. Одиночная скобка всегда начинает поле для подстановки.

Чем f-строка отличается от метода format()?

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

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!