Форматирование строк Python

Из документации Python 3

Операции форматирования, описанные здесь (оператор %), демонстрируют ряд особенностей, которые приводят к ряду распространенных ошибок [...]. Использование более новых литералов строк с форматированием [...] помогает избежать этих ошибок. Эти альтернативы также предоставляют более мощные, гибкие и расширяемые подходы к форматированию текста.

% operator

Предпочитайте строковые литералы

Для нового кода настоятельно рекомендуется использовать str.format или литералы строк с форматированием (Python 3.6+) вместо оператора %.

# % operator: форматирование строк старого стиля (не рекомендуется для нового кода)
name = 'Pete'
'Hello %s' % name  # %s = строковый заполнитель
"Hello Pete"

Мы можем использовать спецификатор формата %d для преобразования целочисленного значения в строку:

num = 5
'I have %d apples' % num
"I have 5 apples"

str.format

В Python 3 был представлен новый способ форматирования строк, который позже был обратно портирован в Python 2.7. Это делает синтаксис форматирования строк более упорядоченным.

# Метод str.format(): современное форматирование строк (Python 2.7+)
name = 'John'
age = 20

"Hello I'm {}, my age is {}".format(name, age)  # {} = заполнитель
"Hello I'm John, my age is 20"
"Hello I'm {0}, my age is {1}".format(name, age)
"Hello I'm John, my age is 20"

Литералы строк с форматированием или f-строки

Если вы используете Python 3.6+, строковые f-строки являются рекомендуемым способом форматирования строк.

Из документации Python 3

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

# f-string: рекомендуемый способ форматирования строк (Python 3.6+)
name = 'Elizabeth'
f'Hello {name}!'  # префикс f позволяет использовать выражения в {}
'Hello Elizabeth!'
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Какой префикс используется для f-строк в Python?
A. fmt
B. f или F
C. format
D. str

В них даже можно выполнять встроенные вычисления:

# f-строки поддерживают выражения: могут включать вычисления внутри {}
a = 5
b = 10
f'Five plus ten is {a + b} and not {2 * (a + b)}.'  # Вычисляет выражения
'Five plus ten is 15 and not 30.'

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

name = 'Robert'
messages = 12
(
f'Hi, {name}. '
f'You have {messages} unread messages'
)
'Hi, Robert. You have 12 unread messages'

Спецификатор =

Это выведет выражение и его значение:

# Спецификатор =: выводит как имя переменной, так и значение (Python 3.8+)
from datetime import datetime
now = datetime.now().strftime("%b/%d/%Y - %H:%M:%S")
f'date and time: {now=}'  # Выводит "now='Nov/14/2022 - 20:50:01'"
"date and time: now='Nov/14/2022 - 20:50:01'"

Добавление пробелов или символов

name = 'Robert'
f"{name.upper() = :-^20}"
'name.upper() = -------ROBERT-------'
f"{name.upper() = :^20}"
'name.upper() =        ROBERT       '
f"{name.upper() = :20}"
'name.upper() = ROBERT              '

Форматирование цифр

Добавление разделителя тысяч

a = 10000000
f"{a:,}"
'10,000,000'

Округление

a = 3.1415926
f"{a:.2f}"
'3.14'
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Что делает f"{a:.2f}"?
A. Округляет число до ближайшего целого
B. Форматирует как процент
C. Форматирует число как число с плавающей точкой с 2 знаками после запятой
D. Преобразует в экспоненциальную нотацию

Отображение в виде процента

a = 0.816562
f"{a:.2%}"
'81.66%'

Таблица форматирования чисел

ЧислоФорматВыводОписание
3.1415926{:.2f}3.14Формат float, 2 знака после запятой
3.1415926{:+.2f}+3.14Формат float, 2 знака после запятой, со знаком
-1{:+.2f}-1.00Формат float, 2 знака после запятой, со знаком
2.71828{:.0f}3Формат float без знаков после запятой
4{:0>2d}04Дополнение нулями (дополнение слева, ширина 2)
4{:x<4d}4xxxДополнение символами x (дополнение справа, ширина 4)
10{:x<4d}10xxДополнение символами x (дополнение справа, ширина 4)
1000000{:,}1,000,000Формат числа с запятой в качестве разделителя
0.35{:.2%}35.00%Формат процента
1000000000{:.2e}1.00e+09Экспоненциальная нотация
11{:11d}11Выравнивание по правому краю (по умолчанию, ширина 10)
11{:<11d}11Выравнивание по левому краю (ширина 10)
11{:^11d}11Выравнивание по центру (ширина 10)

Строки-шаблоны (Template Strings)

Более простой и менее мощный механизм, но он рекомендуется при работе со строками, генерируемыми пользователями. Благодаря своей меньшей сложности строковые шаблоны являются более безопасным выбором.

from string import Template
name = 'Elizabeth'
t = Template('Hey $name!')
t.substitute(name=name)
'Hey Elizabeth!'

Связанные ссылки