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=).
Расширенные примеры форматирования
Динамическое формирование спецификатора формата:
width = 15
precision = 4
value = 13.1415926535
specifier = f"{{:{width}.{precision}f}}" # Создаем строку '{:15.4f}'
print(specifier.format(value))13.1416
Форматирование словарей и списков:
data = {'x': 10, 'y': 20}
print('Координаты: x={x}, y={y}'.format(**data))
items = ['яблоко', 'апельсин']
print('Фрукты: {0[0]}, {0[1]}'.format(items))Координаты: x=10, y=20 Фрукты: яблоко, апельсин
Сложное выравнивание с заполнителем:
for title, price in [('Хлеб', 45.5), ('Молоко', 80.0), ('Яйца, десяток', 120.75)]:
print('{:*<30} {:>10.2f} руб.'.format(title, price))Хлеб************************* 45.50 руб. Молоко************************ 80.00 руб. Яйца, десяток*************** 120.75 руб.
Работа с датами и временем:
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
Использование пользовательских объектов:
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)
Форматирование с условным знаком: Символ + в спецификаторе заставляет выводить знак и для положительных чисел.
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, где спецификация формата следует после двоеточия внутри {}, во многих языках используются специальные символы (например, %) или функции с отдельными строкой формата и аргументами.