W3docs

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

Узнайте три способа форматирования строк в Python — оператор %, str.format() и f-строки — с примерами чисел, выравнивания и практических случаев.

Форматирование строк — это способ встроить значения переменных в текст. Python предлагает три подхода: устаревший оператор %, универсальный метод str.format() и современный синтаксис f-строк, введённый в Python 3.6. Для простых случаев все три дают одинаковый результат, но различаются по мощности, читаемости и требуемой версии Python.

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

  • Оператор % и его коды типов
  • str.format() с позиционными, индексными и именованными плейсхолдерами
  • f-строки — встроенные выражения и спецификатор отладки =
  • Спецификаторы формата: ширина, выравнивание, точность и системы счисления
  • Выбор подходящего метода для вашей ситуации

Связанные главы: Строки Python · Конкатенация строк · Escape-символы · Методы строк

Оператор %

Оператор % — старейший стиль форматирования строк в Python, позаимствованный из printf языка C. Вы размещаете коды типов внутри строки в качестве плейсхолдеров, а затем передаёте значения после знака %.

Распространённые коды типов

КодЗначениеПример входного значенияВывод
%sString (или любой объект)"Alice"Alice
%dЦелое число4242
%fЧисло с плавающей точкой3.143.140000
%rrepr() объекта"hi\n"'hi\n'

Форматирование строк с помощью %s и %d

python— editable, runs on the server
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

python— editable, runs on the server
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

python— editable, runs on the server
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 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

Чтобы отобразить дробь как процент, используйте спецификатор типа %:

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    -> 11111111
255
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 digits
0000000042

Выбор подходящего метода

СитуацияЛучший выбор
Python 3.6 или новееf-строка
Необходима поддержка Python 2оператор %
Повторное использование одного шаблона строкиstr.format() с переменной
Создание шаблонов во время выполненияstr.format()
Быстрая отладочная печатьf-строка со спецификатором =
Поддержка старой кодовой базыПридерживайтесь уже используемого стиля

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

Практика

Практика
Which of the following are correct ways to format strings in Python according to the content on the provided URL?
Which of the following are correct ways to format strings in Python according to the content on the provided URL?
Was this page helpful?