W3docs

Python f-Strings

Освойте Python f-strings: синтаксис, выражения, спецификаторы формата, форматирование чисел, дат, отладку с = и типичные ошибки.

f-strings (форматированные строковые литералы) появились в Python 3.6 и сегодня являются рекомендуемым способом встраивания значений в строки. Они быстрее форматирования через % и str.format(), а также значительно читаемее, поскольку имя переменной находится прямо на своём месте внутри строки.

В этой главе рассматривается:

  • Базовый синтаксис f-string и встраивание переменных
  • Вычисление выражений, вызовы методов и функций внутри строки
  • Спецификаторы формата: выравнивание, ширина, точность и системы счисления
  • Форматирование дат, спецификаторы знака и дополнения нулями
  • Спецификатор отладки = (Python 3.8+)
  • Многострочные f-strings и повторно используемые шаблоны в функциях
  • Типичные ошибки и способы их избежать

Связанные главы: Format Strings · Python String Formatting · Python Strings · Python Dates · Python Regex

Базовый синтаксис

f-string — это любой строковый литерал, перед открывающей кавычкой которого стоит буква f (или F). Любое Python-выражение, помещённое в фигурные скобки {}, вычисляется во время выполнения, преобразуется в строку и вставляется в результат.

name = "Alice"
age = 30
print(f"My name is {name} and I am {age} years old.")
My name is Alice and I am 30 years old.

Префикс f работает с одинарными, двойными и тройными кавычками:

language = "Python"
print(f'I love {language}!')          # single quotes
print(f"""I love {language}!""")      # triple quotes
I love Python!
I love Python!

Встраивание выражений

Заполнитель {} принимает любое допустимое Python-выражение — не только имена переменных. Внутри можно выполнять арифметику, сравнения, вызывать методы, функции и обращаться к ключам словаря.

Арифметика и сравнения

x = 10
y = 3
print(f"{x} divided by {y} is {x / y:.2f}")
print(f"The square of {x} is {x ** 2}")
print(f"Is {x} greater than {y}? {x > y}")
10 divided by 3 is 3.33
The square of 10 is 100
Is 10 greater than 3? True

Вызовы методов

name = "alice smith"
print(f"Hello, {name.title()}!")
print(f"Uppercase: {name.upper()}")
Hello, Alice Smith!
Uppercase: ALICE SMITH

Вызовы функций и встроенные функции

items = ["apples", "bananas", "cherries"]
print(f"You have {len(items)} items in the list.")
You have 3 items in the list.

Обращение к словарю

Используйте одинарные кавычки внутри фигурных скобок для доступа к ключам словаря (внешняя строка в двойных кавычках, поэтому конфликтов нет):

person = {"name": "Bob", "age": 25}
print(f"Name: {person['name']}, Age: {person['age']}")
Name: Bob, Age: 25

Условные выражения

score = 72
print(f"Score: {score} => {'Pass' if score >= 60 else 'Fail'}")
Score: 72 => Pass

Спецификаторы формата

После выражения добавьте двоеточие : и спецификатор формата, чтобы управлять видом значения. Полный синтаксис мини-языка:

{expression:[fill][align][sign][width][grouping][.precision][type]}

Использовать все части необязательно — комбинируйте только нужные.

Выравнивание и ширина

Используйте < (влево), > (вправо) или ^ (по центру) вместе с числом для задания ширины поля:

name = "Alice"
print(f"|{name:<10}|")   # left-align in a field of width 10
print(f"|{name:>10}|")   # right-align
print(f"|{name:^10}|")   # center
|Alice     |
|     Alice|
|  Alice   |

Укажите символ заполнения перед символом выравнивания, чтобы дополнять строку чем-то отличным от пробелов:

print(f"|{'hello':*^15}|")  # fill with * and center
|*****hello*****|

Десятичная точность

pi = 3.14159265
print(f"Pi is approximately {pi:.2f}")   # 2 decimal places
print(f"Pi is approximately {pi:.4f}")   # 4 decimal places
Pi is approximately 3.14
Pi is approximately 3.1416

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

price = 1234567.89
print(f"{price:,.2f}")   # comma as thousands separator
print(f"{price:e}")      # scientific notation
1,234,567.89
1.234568e+06

Отобразить значение как процент напрямую — Python умножит на 100 автоматически:

ratio = 0.853
print(f"{ratio:.1%}")
85.3%

Спецификатор знака

Используйте +, чтобы всегда показывать знак, или пробел, чтобы зарезервировать место для положительных чисел (выравнивание столбцов с отрицательными):

x = 42
y = -7
print(f"{x:+d}")    # +42
print(f"{y:+d}")    # -7
print(f"{x: d}")    # space before positive
print(f"{y: d}")    # -7
+42
-7
 42
-7

Дополнение нулями

Дополните целое число до фиксированной ширины ведущими нулями, поставив 0 перед числом ширины:

print(f"{42:010d}")   # zero-pad to 10 digits
0000000042

Комбинация знака и дополнения нулями — знак занимает первую позицию:

x = 42
print(f"{x:+010d}")   # +000000042
+000000042

Системы счисления для целых чисел

x = 255
print(f"{x:d}")    # decimal   -> 255
print(f"{x:x}")    # hex lower -> ff
print(f"{x:X}")    # hex upper -> FF
print(f"{x:o}")    # octal     -> 377
print(f"{x:b}")    # binary    -> 11111111
255
ff
FF
377
11111111

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

Если поместить объект datetime или date внутрь f-string, после двоеточия можно использовать коды формата strftime — вызов .strftime() не нужен:

from datetime import date
today = date(2024, 6, 19)
print(f"Today is {today:%B %d, %Y}")
print(f"ISO format: {today:%Y-%m-%d}")
Today is June 19, 2024
ISO format: 2024-06-19

Полный список кодов формата strftime см. в главе Python Dates.

Спецификатор отладки = (Python 3.8+)

Добавление = после имени выражения выводит как текст выражения, так и его значение. Это избавляет от необходимости дважды вводить имя переменной и незаменимо при быстрой отладке:

val = 42
result = val * 2
print(f"{val=}, {result=}")
val=42, result=84

Строковые значения обрабатываются через repr(), поэтому кавычки видны:

name = "Alice"
print(f"{name=}")
name='Alice'

Можно комбинировать = со спецификатором формата — спецификатор ставится после =:

pi = 3.14159265
print(f"{pi=:.3f}")
pi=3.142

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

Для длинного текста f-string можно разбить на несколько строк. Хорошо работают два подхода.

Неявная конкатенация строк (обратный слеш внутри скобок не нужен):

name = "Alice"
age = 30
city = "London"
profile = (
    f"Name : {name}\n"
    f"Age  : {age}\n"
    f"City : {city}"
)
print(profile)
Name : Alice
Age  : 30
City : London

Тройные кавычки в f-string — переводы строки буквальные, поэтому \n не нужен:

name = "Alice"
age = 30
report = f"""
Name : {name}
Age  : {age}
""".strip()
print(report)
Name : Alice
Age  : 30

Повторно используемые шаблоны

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

def greet(name, role):
    return f"Hello, {name}! Your role is {role}."

print(greet("Alice", "admin"))
print(greet("Bob", "editor"))
Hello, Alice! Your role is admin.
Hello, Bob! Your role is editor.

Если вам действительно нужен отложенный шаблон, используйте str.format() — см. Format Strings.

Буквальные фигурные скобки в выводе

Чтобы включить символ { или } в вывод буквально, продублируйте его:

value = 42
print(f"The answer is {{value}} = {value}")
The answer is {value} = 42

Типичные ошибки

Обратные слеши внутри выражения (Python < 3.12)

До Python 3.12 обратный слеш не допускается внутри выражения {} в f-string. Обходное решение — вычислить значение в переменной заранее:

items = ["a", "b", "c"]

# This raises SyntaxError on Python < 3.12:
# print(f"{'\n'.join(items)}")

# Workaround — pre-compute:
joined = "\n".join(items)
print(f"Items:\n{joined}")
Items:
a
b
c

В Python 3.12 это ограничение было снято, и обратные слеши теперь допустимы внутри выражений f-string.

Использование одинакового типа кавычек внутри выражения

Если внешняя f-string в двойных кавычках, для ключей словаря внутри {} используйте одинарные кавычки. Если нужен тот же тип кавычек, поменяйте внешние кавычки или используйте переменную:

person = {"name": "Bob"}

# Works — single quotes inside double-quoted f-string
print(f"Name: {person['name']}")

# Also works — pre-assign the key
key = "name"
print(f"Name: {person[key]}")
Name: Bob
Name: Bob

f-strings не являются «ленивыми»

f-string вычисляет все выражения в момент выполнения строки. Если присвоить f-string переменной, она фиксирует текущие значения — изменение переменных после этого не влияет на уже вычисленную строку:

x = 5
msg = f"x is {x}"
x = 99
print(msg)   # still shows 5, not 99
x is 5

Используйте функцию (как показано выше), когда нужен шаблон с отложенным вычислением.

Краткий справочник

СпецификаторПримерВывод
:.2ff"{3.14159:.2f}"3.14
:,f"{1000000:,}"1,000,000
:.1%f"{0.853:.1%}"85.3%
:ef"{1234.5:e}"1.234500e+03
:10f"{'hi':10}"hi (left, width 10)
:<10f"{'hi':<10}"hi
:>10f"{'hi':>10}" hi
:^10f"{'hi':^10}" hi
:010df"{42:010d}"0000000042
:+df"{42:+d}"+42
:bf"{10:b}"1010
:xf"{255:x}"ff
=f"{val=}"val=42
:%Y-%m-%df"{date_obj:%Y-%m-%d}"2024-06-19

Практика

Практика
Which of the following statements about Python f-strings are correct?
Which of the following statements about Python f-strings are correct?
Was this page helpful?