Форматирование: f-строки, format(), %
Форматирование: f-строки, format(), %
Вставить значение переменной в текст — одна из самых частых операций в программировании. Python предоставляет три способа форматирования строк. Вы уже знакомы с f-строками из модуля 1; теперь изучим все три подхода, их особенности и спецификаторы формата.
Три способа форматирования
name = "Алиса"
age = 25
# 1. F-строки (Python 3.6+) — современный способ:
print(f"Привет, {name}! Тебе {age} лет.")
# 2. str.format() — классический способ:
print("Привет, {}! Тебе {} лет.".format(name, age))
# 3. % — старый стиль (не рекомендуется в новом коде):
print("Привет, %s! Тебе %d лет." % (name, age))
Все три дают одинаковый результат. Рекомендация: используйте f-строки в новом коде — они читабельнее и быстрее.
F-строки: возможности
F-строка — строка с префиксом f. Внутри {} можно помещать любое Python-выражение:
x = 10
y = 3
print(f"Сумма: {x + y}") # Сумма: 13
print(f"Частное: {x / y:.2f}") # Частное: 3.33
print(f"Квадрат: {x ** 2}") # Квадрат: 100
print(f"Тип: {type(x).__name__}") # Тип: int
items = ["яблоко", "банан"]
print(f"Элементов: {len(items)}") # Элементов: 2
Спецификаторы формата в f-строках
Формат указывается после двоеточия: {значение:спецификатор}.
Числа:
pi = 3.14159265
print(f"{pi:.2f}") # 3.14 — 2 знака после точки
print(f"{pi:.4f}") # 3.1416 — 4 знака
print(f"{pi:10.2f}") # ' 3.14' — ширина поля 10, выравнивание вправо
print(f"{pi:<10.2f}") # '3.14 ' — выравнивание влево
print(f"{pi:^10.2f}") # ' 3.14 ' — по центру
n = 1234567
print(f"{n:,}") # 1,234,567 — разделитель тысяч
print(f"{n:_}") # 1_234_567 — через подчёркивание
print(f"{n:010}") # 0001234567 — дополнить нулями до 10 символов
Целые числа в разных системах счисления:
n = 255
print(f"{n:d}") # 255 — десятичное
print(f"{n:b}") # 11111111 — двоичное
print(f"{n:o}") # 377 — восьмеричное
print(f"{n:x}") # ff — шестнадцатеричное
print(f"{n:#x}") # 0xff — с префиксом
Строки:
s = "hello"
print(f"{s:>10}") # ' hello' — вправо
print(f"{s:<10}") # 'hello ' — влево
print(f"{s:^10}") # ' hello ' — по центру
print(f"{s:*^10}") # '**hello***' — заполнитель *
Отладочный режим f-строк: =
Добавление = внутри {} выводит и имя переменной, и её значение — удобно при отладке:
x = 42
name = "Алиса"
print(f"{x=}") # x=42
print(f"{name=}") # name='Алиса'
print(f"{x + 1=}") # x + 1=43
Это Python 3.8+. Очень удобно вместо print(f"x = {x}").
str.format(): именованные аргументы
format() позволяет ссылаться на аргументы по позиции или имени:
# По позиции:
print("Имя: {0}, Возраст: {1}".format("Алиса", 25))
print("Имя: {1}, Снова имя: {0}".format("Алиса", "Борис")) # порядок свой
# По имени:
print("Привет, {name}! Тебе {age} лет.".format(name="Алиса", age=25))
# Спецификаторы работают так же:
print("{:.2f}".format(3.14159)) # 3.14
print("{:>10}".format("hello")) # ' hello'
format() полезен, когда шаблон хранится отдельно от данных:
template = "Дорогой(ая) {name}, Ваш заказ #{order_id} доставлен."
message = template.format(name="Алиса", order_id=12345)
print(message)
% форматирование: старый стиль
Этот стиль унаследован из C/Python 2. Основные спецификаторы:
name = "Алиса"
age = 25
score = 95.5
print("Имя: %s" % name) # строка
print("Возраст: %d" % age) # целое
print("Балл: %.1f" % score) # дробное с 1 знаком
print("Имя: %s, возраст: %d" % (name, age)) # несколько значений — кортеж
Спецификаторы %:
%s— строка (любой тип через str())%d— целое число%f— дробное число%r— repr (для отладки)%.2f— дробное с 2 знаками
Не используйте % в новом коде — только для понимания чужого кода.
Практический пример: форматированная таблица
headers = ["Имя", "Оценка", "Статус"]
data = [
("Алиса", 92, "сдала"),
("Борис", 55, "не сдал"),
("Вера", 78, "сдала"),
]
print(f"{'Имя':<12} {'Оценка':>8} {'Статус':<10}")
print("-" * 32)
for name, score, status in data:
print(f"{name:<12} {score:>8} {status:<10}")
Вывод:
Имя Оценка Статус
--------------------------------
Алиса 92 сдала
Борис 55 не сдал
Вера 78 сдала
Проверь себя
Что выведет следующий код?
n = 42
print(f"{'0' * (5 - len(str(n)))}{n}")
len(str(42)) = 2. 5 - 2 = 3. '0' * 3 = '000'. Конкатенация: '000' + '42' = '00042'. То же можно сделать через f"{n:05d}".
Итог
- F-строки (
f"...") — современный способ форматирования; поддерживают любые выражения. - Спецификатор формата:
{значение:спецификатор}—:.2f(точность),:10(ширина),:</:>/:^(выравнивание). {x=}в f-строке (Python 3.8+) — отладочный вывод:x=42.str.format()— именованные шаблоны; хорош для отделения шаблона от данных.%форматирование — устаревший стиль; только для чтения старого кода.
В следующем уроке разберём методы для изменения регистра и проверки свойств строк: isdigit, startswith, upper и другие.