Чтобы вставить переменную в текст, поставьте букву f перед кавычками, а саму переменную заключите в фигурные скобки: f"Мне {age} лет". Python подставит значение в момент выполнения строки. Внутри скобок работает любое выражение: арифметика, вызов метода, условие. После двоеточия задаётся формат: два знака после запятой, разделитель разрядов, ширина колонки.
Ниже синтаксис, таблица спецификаторов и ошибки, на которых чаще всего ломается код. Вывод в примерах получен в Python 3.14, а где 3.11 ведёт себя иначе, это отмечено. Если нужны остальные операции со строками (разрезать, заменить, убрать пробелы), они собраны в шпаргалке по методам строк в Python.
Как написать f-строку

- Поставьте
fилиFпрямо перед открывающей кавычкой, без пробела. - Внутри строки напишите в фигурных скобках имя переменной или выражение.
- Выведите результат через
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.
Форматирование чисел: знаки после запятой, разряды, проценты

После выражения ставится двоеточие, за ним спецификатор. Это тот же мини-язык формата, что у метода 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.
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-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 011 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | - | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




