Форматирование строк
Узнайте три способа форматирования строк в Python — оператор %, str.format() и f-строки — с примерами чисел, выравнивания и практических случаев.
Форматирование строк — это способ встроить значения переменных в текст. Python предлагает три подхода: устаревший оператор %, универсальный метод str.format() и современный синтаксис f-строк, введённый в Python 3.6. Для простых случаев все три дают одинаковый результат, но различаются по мощности, читаемости и требуемой версии Python.
В этой главе рассматриваются:
- Оператор
%и его коды типов str.format()с позиционными, индексными и именованными плейсхолдерами- f-строки — встроенные выражения и спецификатор отладки
= - Спецификаторы формата: ширина, выравнивание, точность и системы счисления
- Выбор подходящего метода для вашей ситуации
Связанные главы: Строки Python · Конкатенация строк · Escape-символы · Методы строк
Оператор %
Оператор % — старейший стиль форматирования строк в Python, позаимствованный из printf языка C. Вы размещаете коды типов внутри строки в качестве плейсхолдеров, а затем передаёте значения после знака %.
Распространённые коды типов
| Код | Значение | Пример входного значения | Вывод |
|---|---|---|---|
%s | String (или любой объект) | "Alice" | Alice |
%d | Целое число | 42 | 42 |
%f | Число с плавающей точкой | 3.14 | 3.140000 |
%r | repr() объекта | "hi\n" | 'hi\n' |
Форматирование строк с помощью %s и %d
My name is John and I am 30 years old.Когда значений больше одного, передайте их в виде кортежа. Значения сопоставляются с плейсхолдерами слева направо:
item = "coffee"
price = 2.50
qty = 3
print("Item: %s | Price: $%.2f | Qty: %d" % (item, price, qty))Item: coffee | Price: $2.50 | Qty: 3Код формата %.2f округляет число с плавающей точкой до 2 знаков после запятой.
Когда использовать %: Главным образом при работе с очень старым кодом или кодовыми базами Python 2. Для нового кода предпочтительнее str.format() или f-строки.
str.format()
Метод str.format() использует плейсхолдеры в фигурных скобках {} и более гибкий, чем %. Он поддерживает позиционные аргументы, повторное использование по индексу и именованные аргументы-ключевые слова.
Позиционные плейсхолдеры
Пустые фигурные скобки {} заполняются слева направо аргументами, переданными в format():
Форматирование строк с помощью метода format в Python
My name is John and I am 30 years old.Плейсхолдеры по индексу
Поместите число внутри скобок, чтобы выбрать конкретный аргумент. Можно также повторять один и тот же аргумент:
name = "John"
age = 30
print("{0} is {1} years old and {0} likes Python.".format(name, age))John is 30 years old and John likes Python.Именованные плейсхолдеры
Используйте именованные ключи для максимально читаемого форматирования. Это также позволяет изменять порядок значений независимо от списка аргументов:
name = "John"
age = 30
print("{name} is {age} years old.".format(name=name, age=age))John is 30 years old.Вы можете распаковать словарь напрямую с помощью **:
person = {"name": "Alice", "city": "London"}
print("{name} lives in {city}.".format(**person))Alice lives in London.f-строки (Python 3.6+)
f-строки (форматированные строковые литералы) записываются с префиксом f или F перед строкой. Любое выражение внутри {} вычисляется во время выполнения и преобразуется в строку. Это самый быстрый и читаемый вариант для современного кода на Python.
Форматирование строк с помощью f-строк в Python
My name is John and I am 30 years old.Поскольку фигурные скобки могут содержать любое допустимое выражение Python, вы не ограничены простыми именами переменных:
x = 10
y = 3
print(f"{x} divided by {y} is {x / y:.2f}")10 divided by 3 is 3.33Спецификатор отладки = (Python 3.8+)
Добавьте = после имени переменной, чтобы вывести как имя переменной, так и её значение — очень удобно для быстрой отладки:
val = 42
result = val * 2
print(f"{val=}, {result=}")val=42, result=84Спецификаторы формата
Все три метода поддерживают мини-язык для управления отображением значений. Синтаксис внутри {} для format() и f-строк:
{[value]:[fill][align][sign][width][grouping][.precision][type]}Выравнивание и ширина
Используйте < (влево), > (вправо) или ^ (по центру) вместе с числом ширины:
name = "John"
print(f"|{name:<10}|") # left-align in a field of width 10
print(f"|{name:>10}|") # right-align
print(f"|{name:^10}|") # center|John |
| John|
| John |Перед символом выравнивания можно указать символ заполнения:
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Чтобы отобразить дробь как процент, используйте спецификатор типа %:
ratio = 0.853
print(f"{ratio:.1%}")85.3%Системы счисления для целых чисел
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Те же спецификаторы работают с str.format():
print("{:b}".format(255)) # 11111111
print("{:x}".format(255)) # ffЗаполнение нулями
Дополните целое число до фиксированной ширины ведущими нулями, используя 0 перед шириной:
print(f"{42:010d}") # zero-pad to 10 digits0000000042Выбор подходящего метода
| Ситуация | Лучший выбор |
|---|---|
| Python 3.6 или новее | f-строка |
| Необходима поддержка Python 2 | оператор % |
| Повторное использование одного шаблона строки | str.format() с переменной |
| Создание шаблонов во время выполнения | str.format() |
| Быстрая отладочная печать | f-строка со спецификатором = |
| Поддержка старой кодовой базы | Придерживайтесь уже используемого стиля |
f-строки — рекомендуемый вариант по умолчанию для всего нового кода на Python 3. Они быстрее str.format() (нет накладных расходов на вызов метода) и читаемее, чем %.