Str.format: примеры (PYTHON)

Форматирование строк методом str.format в языке Python
Раздел: Строки, Форматирование
str.format(args, kwargs): str

Функция str.format в Python

Метод str.format() является одним из основных инструментов для форматирования строк в Python. Он позволяет создавать строки, вставляя значения в заранее определенные места, обозначенные фигурными скобками {}. Этот метод используется, когда требуется динамически генерировать строки на основе переменных, обеспечивая контроль над представлением данных (например, над количеством знаков после запятой, выравниванием, преобразованием типов).

Синтаксис метода: строка_шаблона.format(*args, **kwargs).

Аргументы:

  • *args (позиционные аргументы): Значения, которые подставляются в заполнители {} по порядку их следования (по индексу). Например, '{0} {1}'.format('a', 'b') даст 'a b'.
  • **kwargs (именованные аргументы): Пары ключ-значение. В шаблоне используются имена ключей. Например, '{name}'.format(name='Иван') даст 'Иван'.

Заполнители (фигурные скобки) могут содержать спецификаторы формата, разделенные двоеточием :. Общий вид: {[имя_поля][!функция_преобразования][:спецификация_формата]}.

  • имя_поля: Число (индекс) или имя ключа из **kwargs.
  • !функция_преобразования: Может быть s (для str()), r (для repr()) или a (для ascii()).
  • :спецификация_формата: Определяет, как значение будет представлено. Синтаксис: [[заполнитель]выравнивание][знак][#][0][ширина][,][.точность][тип].

Возвращаемое значение: Метод возвращает новую отформатированную строку. Исходная строка-шаблон не изменяется.

Примеры использования str.format()

Базовые подстановки:

print('{} и {}'.format('Чашка', 'блюдце'))
Чашка и блюдце
print('{1} перед {0}'.format('рассветом', 'Ночь'))
Ночь перед рассветом

Именованные аргументы:

print('Город: {city}, год: {year}'.format(city='Москва', year=1147))
Город: Москва, год: 1147

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

print('Число: {:.2f}'.format(3.14159))  # 2 знака после запятой
print('Процент: {:.1%}'.format(0.756))  # Процентный формат
print('Шестнадцатеричное: {:x}'.format(255))  # hex
Число: 3.14
Процент: 75.6%
Шестнадцатеричное: ff

Выравнивание и заполнение:

print('[{:>10}]'.format('право'))   # Выравнивание по правому краю, ширина 10
print('[{:^10}]'.format('центр'))   # По центру
print('[{:<10}]'.format('лево'))    # По левому краю
print('[{:0=10}]'.format(-42))      # Заполнение нулями с учетом знака
[     право]
[   центр   ]
[лево      ]
[-000000042]

Форматирование с использованием преобразований:

value = "Строка"
print('str: {!s}, repr: {!r}'.format(value, value))
str: Строка, repr: 'Строка'

Альтернативные методы форматирования строк в Python

f-строки (Python 3.6+): Позволяют встраивать выражения прямо в строковые литералы. Очень читаемы и производительны. Рекомендуются для нового кода.

name = "Анна"
age = 30
print(f"Имя: {name}, возраст: {age}")
Имя: Анна, возраст: 30

Оператор % (старый стиль): Напоминает форматирование в языке C. Менее гибок, чем str.format, но может быть удобен в простых случаях или при портировании старого кода.

print("Имя: %s, число: %05d" % ("Петр", 7))
Имя: Петр, число: 00007

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

Частые ошибки при использовании str.format()

Несоответствие количества аргументов:

try:
    print('{} {}'.format('один'))
except IndexError as e:
    print(f"Ошибка: {e}")
Ошибка: Replacement index 1 out of range for positional args tuple

Ошибка в имени ключа:

try:
    print('{city}'.format(country='Россия'))
except KeyError as e:
    print(f"Ошибка: Отсутствует ключ {e}")
Ошибка: Отсутствует ключ 'city'

Неправильный спецификатор для типа данных:

try:
    print('Целое число: {:d}'.format("не число"))
except ValueError as e:
    print(f"Ошибка: {e}")
Ошибка: Unknown format code 'd' for object of type 'str'

Использование неэкранированных фигурных скобок: Чтобы вывести фигурные скобки как символы, их нужно удвоить.

print('Фигурные скобки: {{ и }}'.format())  # Правильно
print('Ошибка: { и }'.format())            # Вызовет исключение
Фигурные скобки: { и }
Traceback (most recent call last):
...
KeyError: ' и '

Изменения в работе функции

Основной синтаксис str.format() стабилен с момента его введения. Однако, связанные с ним возможности языка эволюционировали.

  • Python 3.1: Добавлена возможность использовать запятую , в спецификаторе формата как разделитель тысяч для чисел: '{:,}'.format(1000000) вернет '1,000,000'.
  • Python 3.6: Появились f-строки (f"..."), которые стали более удобной и производительной альтернативой для большинства случаев, но сам метод str.format остался без изменений.
  • Python 3.8: В спецификатор формата для чисел добавлен символ =, который выводит знак числа и заполнители: '{:=10}'.format(-42) даст - 42 (ранее для этого использовался более сложный синтаксис 0=).

Расширенные примеры форматирования

Динамическое формирование спецификатора формата:

Пример python
width = 15
precision = 4
value = 13.1415926535
specifier = f"{{:{width}.{precision}f}}"  # Создаем строку '{:15.4f}'
print(specifier.format(value))
          13.1416

Форматирование словарей и списков:

Пример python
data = {'x': 10, 'y': 20}
print('Координаты: x={x}, y={y}'.format(**data))

items = ['яблоко', 'апельсин']
print('Фрукты: {0[0]}, {0[1]}'.format(items))
Координаты: x=10, y=20
Фрукты: яблоко, апельсин

Сложное выравнивание с заполнителем:

Пример python
for title, price in [('Хлеб', 45.5), ('Молоко', 80.0), ('Яйца, десяток', 120.75)]:
    print('{:*<30} {:>10.2f} руб.'.format(title, price))
Хлеб*************************      45.50 руб.
Молоко************************      80.00 руб.
Яйца, десяток***************     120.75 руб.

Работа с датами и временем:

Пример python
from datetime import datetime
dt = datetime.now()
print('Сегодня: {:%d.%m.%Y %H:%M}'.format(dt))
print('Дата: {0.day:02d}.{0.month:02d}.{0.year}'.format(dt))
Сегодня: 17.11.2023 14:30
Дата: 17.11.2023

Использование пользовательских объектов:

Пример python
class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y
    def __format__(self, spec):
        if spec == 'кратко':
            return f'({self.x},{self.y})'
        else:
            return f'Точка: x={self.x}, y={self.y}'

p = Point(3, 4)
print('{}'.format(p))
print('{:кратко}'.format(p))
Точка: x=3, y=4
(3,4)

Форматирование с условным знаком: Символ + в спецификаторе заставляет выводить знак и для положительных чисел.

Пример python
temps = [+5.5, -3.2, +0.0]
for t in temps:
    print('Температура: {:+7.1f}°C'.format(t))
Температура:    +5.5°C
Температура:    -3.2°C
Температура:    +0.0°C

Форматирование строк в других языках

JavaScript (шаблонные литералы): Используются обратные кавычки и выражения в ${}.

let name = "Ольга";
console.log(`Привет, ${name}!`);
Привет, Ольга!

Java (String.format): Синтаксис похож на старый стиль Python (%).

String result = String.format("Строка: %s, Число: %d", "text", 10);
System.out.println(result);
Строка: text, Число: 10

PHP (sprintf, интерполяция): Функция sprintf использует спецификаторы, похожие на C. Переменные можно вставлять напрямую в строки в двойных кавычках.

$sum = 123.456;
echo sprintf("Итого: %.2f", $sum); // Итого: 123.46
echo "Итого: $sum"; // Итого: 123.456
Итого: 123.46
Итого: 123.456

C# (String.Format, интерполяция): Метод String.Format использует нумерованные заполнители {0}. В новых версиях доступна интерполяция строк с $.

string name = "Мир";
Console.WriteLine(String.Format("Привет, {0}!", name));
Console.WriteLine($"Привет, {name}!");
Привет, Мир!
Привет, Мир!

Golang (fmt.Sprintf, fmt.Printf): Пакет fmt предоставляет функции с глаголами форматирования (как %v для значения по умолчанию).

import "fmt"
result := fmt.Sprintf("Значение: %v, Тип: %T", 42, 42)
fmt.Println(result)
Значение: 42, Тип: int

В отличие от str.format, где спецификация формата следует после двоеточия внутри {}, во многих языках используются специальные символы (например, %) или функции с отдельными строкой формата и аргументами.

питон str.format function comments

En
Str.format Format string with values