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 quotesI 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 placesPi 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 notation1,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 digits0000000042Комбинация знака и дополнения нулями — знак занимает первую позицию:
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 -> 11111111255
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: Bobf-strings не являются «ленивыми»
f-string вычисляет все выражения в момент выполнения строки. Если присвоить f-string переменной, она фиксирует текущие значения — изменение переменных после этого не влияет на уже вычисленную строку:
x = 5
msg = f"x is {x}"
x = 99
print(msg) # still shows 5, not 99x is 5Используйте функцию (как показано выше), когда нужен шаблон с отложенным вычислением.
Краткий справочник
| Спецификатор | Пример | Вывод |
|---|---|---|
:.2f | f"{3.14159:.2f}" | 3.14 |
:, | f"{1000000:,}" | 1,000,000 |
:.1% | f"{0.853:.1%}" | 85.3% |
:e | f"{1234.5:e}" | 1.234500e+03 |
:10 | f"{'hi':10}" | hi (left, width 10) |
:<10 | f"{'hi':<10}" | hi |
:>10 | f"{'hi':>10}" | hi |
:^10 | f"{'hi':^10}" | hi |
:010d | f"{42:010d}" | 0000000042 |
:+d | f"{42:+d}" | +42 |
:b | f"{10:b}" | 1010 |
:x | f"{255:x}" | ff |
= | f"{val=}" | val=42 |
:%Y-%m-%d | f"{date_obj:%Y-%m-%d}" | 2024-06-19 |