F-строки (или форматированные строковые литералы) были добавлены в Python 3.6 и быстро стали предпочтительным способом подстановки значений в строки. Они начинаются с префикса f перед строкой и позволяют вставлять выражения прямо внутрь строки, обрамляя их фигурными скобками. Это решение быстрее и читаемее по сравнению с методами str.format() или операцией конкатенации.
Пример: name = «Алиса», age = 30. С f-строкой f»{name} – {age} лет» сразу вернёт «Алиса – 30 лет». F-строки поддерживают любые выражения, включая вызовы функций, арифметику и доступ к атрибутам: f»{user.name.upper()} – {user.age + 1}».
При использовании f-строк важно учитывать, что выражения внутри скобок интерпретируются как обычный Python-код. Это означает, что в них могут быть ошибки выполнения, особенно если переменные не определены. Не поддерживается отложенное форматирование – строка обрабатывается сразу в момент выполнения.
Если требуется вывести отладочную информацию, начиная с Python 3.8 можно использовать синтаксис f»{var=}», который автоматически вставит имя переменной и её значение, например: var = 42 → f»{var=}» даст «var=42».
Как вставлять переменные в строки с помощью f-строк
f-строки (форматированные строковые литералы) позволяют внедрять значения переменных непосредственно в строку, используя синтаксис f"текст {переменная}"
. Это упрощает код и повышает его читаемость.
Пример базового использования:
name = "Андрей"
age = 28
print(f"Имя: {name}, возраст: {age}")
Можно выполнять выражения прямо внутри фигурных скобок:
price = 49.99
quantity = 3
print(f"Сумма: {price * quantity} руб.")
Форматирование чисел:
value = 12.34567
print(f"Округлённое значение: {value:.2f}") # 12.35
Для целых чисел:
number = 42
print(f"{number:05}") # 00042
Работа с датами требует модуля datetime
:
from datetime import datetime
now = datetime.now()
print(f"Текущая дата: {now:%d.%m.%Y}")
Вложенные выражения и вызовы функций тоже допустимы:
def get_name():
return "Ольга"
print(f"Пользователь: {get_name().upper()}")
Чтобы вставить фигурные скобки как символы, нужно удвоить их:
value = 10
print(f"{{Значение: {value}}}") # {Значение: 10}
f-строки не поддерживают выражения с присваиванием (:=
) в Python до версии 3.8 включительно. С Python 3.12 можно использовать вложенные f-строки, но не во всех контекстах это безопасно. Используйте только, если уверены в необходимости:
name = "Катя"
print(f"Привет, {f'{name}!'}")
Избегайте сложных выражений в фигурных скобках, если это снижает читаемость. Для многошаговых вычислений лучше использовать переменные заранее.
Форматирование чисел и дат внутри f-строк
Пример:
price = 1234.56789
print(f"Цена: {price:.2f} ₽")
Для выравнивания по ширине применяется {value:10.2f} – число занимает не менее 10 символов, включая два после запятой:
Пример:
value = 7.5
print(f"Значение: {value:10.2f}")
Разделители тысяч добавляются через , или пробел: {value:,.0f} или {value:_.0f}:
Пример:
n = 1000000
print(f"{n:,} – с запятой")
print(f"{n:_} – с подчёркиванием")
1,000,000 – с запятой
1_000_000 – с подчёркиванием
Пример:
num = 255
print(f"{num:b}") # 11111111
print(f"{num:o}") # 377
print(f"{num:x}") # ff
Форматирование дат требует модуля datetime
. Используйте метод strftime()
внутри f-строки:
Пример:
from datetime import datetime
now = datetime.now()
print(f"Текущая дата: {now.strftime('%d.%m.%Y')}")
Для времени: {now.strftime('%H:%M:%S')}
– 24-часовой формат. Для ISO 8601: {now.isoformat()}
.
Если нужно отображать дату с локализацией, используйте модуль locale
с установкой нужной локали перед вызовом strftime()
.
Вложенные выражения и вызовы функций в f-строках
В f-строках допускается использование любых выражений, допустимых в Python, включая вызовы функций, арифметические операции, условные выражения и генераторы. Это позволяет формировать строки с вычисляемыми значениями без предварительных переменных.
Пример с вызовом функции:
def формат_цены(цена):
return f"{цена:,.2f} ₽"
цена = 15720.5
print(f"Итоговая сумма: {формат_цены(цена)}")
Вложенные вызовы:
def с_налогом(сумма):
return сумма * 1.2
print(f"Сумма с налогом: {формат_цены(с_налогом(цена))}")
Арифметика и логика прямо внутри f-строки:
количество = 3
цена_за_штуку = 499.99
print(f"Общая стоимость: {количество * цена_за_штуку:.2f} ₽")
Условное выражение:
баллы = 85
print(f"Оценка: {'отлично' if баллы >= 80 else 'хорошо'}")
Списковые выражения и генераторы:
данные = [1, 2, 3, 4]
print(f"Сумма: {sum(x * 2 for x in данные)}")
Рекомендация: избегайте чрезмерно сложных выражений внутри f-строк, чтобы сохранить читаемость. Если выражение не укладывается в одну строку или содержит несколько уровней вложенности, выносите его в отдельные переменные.
Сравнение f-строк с .format() и операцией %
f-строки появились в Python 3.6 и сразу стали предпочтительным способом форматирования строк благодаря лаконичности и читаемости. Ниже перечислены ключевые отличия между f-строками, методом .format()
и оператором %
.
- Скорость выполнения: f-строки быстрее обоих альтернатив, так как обрабатываются на этапе компиляции. Метод
.format()
медленнее из-за необходимости разбора шаблона во время выполнения. Оператор%
ближе по скорости к.format()
. - Читаемость: f-строки позволяют вставлять выражения непосредственно в строку:
f"{x + y}"
, без необходимости явно передавать переменные, как в"{}".format(x + y)
. - Гибкость: f-строки поддерживают любые выражения Python:
f"{user.name.upper()}"
. Оператор%
не позволяет использовать сложные выражения и требует явного указания типа:"%s" % value
. - Поддержка форматов: f-строки и
.format()
поддерживают спецификации формата (например,.2f
,:>10
), но синтаксис f-строк короче:f"{value:.2f}"
против"{:.2f}".format(value)
. Оператор%
также поддерживает форматирование, но ограничен:"%.2f" % value
. - Ошибки при форматировании: f-строки и
.format()
выбрасывают исключения при несоответствии аргументов. Оператор%
менее устойчив: при неверном типе может silently дать некорректный результат или выброситьTypeError
.
Рекомендуется использовать f-строки в новых проектах. Метод .format()
уместен, когда формат задаётся динамически (например, из переменной). Оператор %
следует избегать, за исключением обратной совместимости с устаревшим кодом.
Многострочные f-строки: синтаксис и примеры
Многострочные f-строки применяются для форматирования текста, разбитого на несколько строк, с возможностью вставки выражений Python. Синтаксис аналогичен обычным f-строкам, но используется тройные кавычки.
name = "Анна"
age = 32
info = f"""
Имя: {name}
Возраст: {age}
"""
print(info)
Переводы строк сохраняются автоматически. Чтобы избежать лишних отступов, применяйте функцию textwrap.dedent
из модуля textwrap
:
import textwrap
name = "Иван"
city = "Казань"
message = f"""{{
textwrap.dedent(f"""
Пользователь: {name}
Город: {city}
""")
}}"""
print(message)
Многострочные f-строки можно комбинировать с выражениями и функциями прямо внутри подстановок:
from datetime import date
user = "Олег"
joined = date(2020, 5, 1)
report = f"""
Пользователь: {user}
Стаж: {(date.today() - joined).days // 365} лет
"""
print(report)
Если требуется включить фигурные скобки как символы, используйте двойные:
value = 42
result = f"""
Значение в словаре: {{'ключ': {value}}}
"""
print(result)
Для повышения читаемости кода избегайте вложенных f-строк внутри f-строк. Вместо этого вынесите выражения в отдельные переменные.
F-строки и экранирование фигурных скобок
В Python фигурные скобки используются для вставки значений в строку с помощью F-строк. Однако, если в строке нужно вывести сами фигурные скобки, необходимо применить экранирование. Это делается с помощью двойных фигурных скобок {{ и }}. Таким образом, одинарные фигурные скобки используются для подстановки значений, а двойные – для их отображения.
Пример экранирования фигурных скобок:
x = 5
formatted_string = f"Значение x: {{x}}"
print(formatted_string)
Результат выполнения кода:
Значение x: {x}
Если не экранировать фигурные скобки, Python попытается интерпретировать их как часть выражения. В результате возникнет ошибка. Важный момент – экранировать нужно именно парные фигурные скобки: одну { или } нельзя экранировать, это приведет к синтаксической ошибке.
Также важно помнить, что экранирование работает только с парой скобок. Например, следующий код вызовет ошибку:
formatted_string = f"Значение x: {x}"
Типовые ошибки при использовании f-строк и способы их избежать
При работе с f-строками в Python могут возникать следующие типовые ошибки:
- Ошибки синтаксиса при использовании фигурных скобок
Неверное использование фигурных скобок приводит к ошибке. Например, если в строке внутри f-строки забыть закрыть одну из скобок, Python не сможет интерпретировать выражение.
f"Результат: {10 * 2"
Чтобы избежать ошибки, всегда проверяйте, что все фигурные скобки правильно открыты и закрыты.
- Неправильное использование кавычек
Ошибки могут возникнуть, если внутри f-строки использовать одинаковые кавычки, что приводит к конфликту. Например, при необходимости использовать кавычки внутри строки нужно правильно их экранировать или применять разные типы кавычек.
f"Сказал: 'Привет'"
Чтобы избежать ошибок, всегда проверяйте соответствие кавычек.
- Ошибки при типах данных в выражениях
Некоторые выражения могут привести к ошибке типа. Например, если пытаемся вывести строку с числовым значением без явного преобразования типов, это приведет к ошибке.
f"Значение: {3 + 'a'}"
Чтобы избежать ошибки, убедитесь, что операции выполняются над совместимыми типами данных. В случае необходимости приводите их к нужному типу.
- Ошибки с экранированием внутри f-строк
Если в строках используется символ обратного слэша, который имеет специальное значение, могут возникнуть проблемы с экранированием. Например:
f"Путь: C:\new\folder"
Чтобы избежать ошибок, используйте либо двойной обратный слэш, либо сырые строки (с префиксом r
) для указания пути:
f"Путь: C:\\new\\folder"
f"Путь: {r'C:\new\folder'}"
- Ошибки с выражениями, возвращающими пустые значения
Если выражение в f-строке возвращает None
, это может привести к неожиданному результату. Например:
f"Результат: {None}"
Для избежания ошибок всегда проверяйте, что переменная или выражение не имеют значения None
, прежде чем использовать их в f-строке.
- Ошибки в форматировании чисел
Когда в f-строках используется форматирование чисел, может быть забыто указать нужный формат, что приведет к неверному отображению значений.
f"Число: {12345.6789}"
Чтобы избежать проблемы, указывайте точное требуемое форматирование:
f"Число: {12345.6789:.2f}"
Это гарантирует, что число будет отображаться с двумя знаками после запятой.