Подстановка переменных в строку: методы и приёмы

Раздел: Ввод-вывод -> Форматирование строк и чисел

Форматирование строк в Python: обзор методов

В Python существует несколько способов встраивания значений переменных в строки. Каждый метод имеет свои особенности, удобство использования и производительность. Рассмотрим основные подходы: f-строки (самый современный и эффективный), метод str.format(), оператор % (старый стиль) и шаблонные строки из модуля string.Template.

Как вставить переменные в строку с помощью f-строк?

Начиная с Python 3.6, f-строки (f-strings) являются наиболее удобным и производительным способом форматирования. Они позволяют прямо в строке указывать выражения внутри фигурных скобок.

name = "Анна"
age = 30
result = f"Меня зовут {name}, мне {age} лет."
print(result)

Python format string (форматирование строк в python)

Меня зовут Анна, мне 30 лет.

Внутри скобок можно использовать любые выражения, включая вызовы функций и арифметические операции:

a = 5
b = 3
print(f"Сумма {a} и {b} равна {a + b}")
Сумма 5 и 3 равна 8

Типичные проблемы и ошибки:

  • Если в строке требуется вывести фигурные скобки как текст, их необходимо дублировать: {{ и }}.
  • В f-строках нельзя использовать обратную косую черту для экранирования внутри выражений. Например, f"{\n}" вызовет ошибку. Для переноса строки можно использовать chr(10) или просто добавлять символ новой строки снаружи.
  • Выражение не может быть пустым: {} без содержимого вызовет синтаксическую ошибку.

Решение проблем:

Для вывода фигурных скобок: f"{{скобка}}" даст строку {скобка}. Для сложных выражений с кавычками внутри допустимо применять разные типы кавычек (например, двойные для строки и одинарные внутри).

Как отформатировать строку с помощью метода format?

Метод str.format() появился в Python 3 и предоставляет гибкие возможности подстановки значений по позиции или по имени.

template = "Меня зовут {name}, мне {age} лет."
print(template.format(name="Анна", age=30))
Меня зовут Анна, мне 30 лет.

Можно использовать позиционные аргументы:

print("{} {} {}".format(1, 2, 3))
1 2 3

Доступны спецификаторы формата, например, для чисел:

pi = 3.14159265
print("Число π = {:.2f}".format(pi))
Число π = 3.14

Типичные проблемы и ошибки:

  • Несоответствие количества аргументов и мест вставки вызывает IndexError или KeyError.
  • Сложные спецификаторы могут быть трудны для чтения.
  • Производительность ниже, чем у f-строк.

Решение проблем:

Рекомендуется всегда проверять соответствие числа аргументов. Для упрощения полезно применять именованные аргументы.

Как использовать старый стиль форматирования с оператором %?

Оператор % (по аналогии с C-функцией printf) был основным в Python 2. Он до сих пор поддерживается, но считается устаревшим для новых проектов.

name = "Иван"
age = 25
print("Меня зовут %s, мне %d лет." % (name, age))
Меня зовут Иван, мне 25 лет.

Спецификаторы: %s для строк, %d для целых, %f для чисел с плавающей точкой.

Типичные проблемы и ошибки:

  • Несоответствие типа данных: если передать строку для %d, возникнет ошибка TypeError.
  • Ограниченные возможности форматирования (нет выравнивания, заполнения).
  • Трудно читать при большом количестве аргументов.

Решение проблем:

Следует использовать кортеж справа от оператора % для нескольких аргументов. Для словарей можно применять %(key)s.

Как использовать шаблонные строки из модуля string?

Модуль string предоставляет класс Template, который позволяет задавать шаблоны с заменой через $. Это безопасно для форматирования строк, полученных от пользователя.

from string import Template
t = Template("Здравствуйте, $name! Вам $age лет.")
result = t.substitute(name="Мария", age=28)
print(result)
Здравствуйте, Мария! Вам 28 лет.

Метод safe_substitute не вызывает ошибки, если переменная отсутствует.

Типичные проблемы и ошибки:

  • Если переменная не найдена и используется substitute, возникает KeyError.
  • Синтаксис ограничен: можно использовать только простые идентификаторы.

Решение проблем:

Рекомендуется применять safe_substitute, если нет уверенности в наличии всех ключей. Для сложных выражений лучше подходят f-строки или format.

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

В этом разделе представлены менее распространенные, но полезные приемы.

Форматирование даты и времени с помощью f-строк

Пример
from datetime import datetime
now = datetime.now()
print(f"Сегодня {now:%d.%m.%Y}, время {now:%H:%M:%S}")
Сегодня 25.10.2023, время 14:30:00

Внутри f-строки можно напрямую вызвать метод strftime, используя двоеточие после имени переменной.

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

Пример
text = "Привет"
print(f"{text:>10}")   # выравнивание вправо, минимальная ширина 10
print(f"{text:^10}")    # по центру
print(f"{text:*<10}")  # заполнение слева звездочками
    Привет
  Привет  
Привет****

Числа в разных системах счисления

Пример
value = 255
print(f"Шестнадцатеричное: {value:#x}")   # 0xff
print(f"Восьмеричное: {value:#o}")        # 0o377
print(f"Двоичное: {value:#b}")            # 0b11111111
Шестнадцатеричное: 0xff
Восьмеричное: 0o377
Двоичное: 0b11111111

Использование format_map для форматирования с помощью словаря

Пример
data = {'name': 'Ольга', 'age': 32}
template = "Имя: {name}, возраст: {age}"
print(template.format_map(data))
Имя: Ольга, возраст: 32

Метод format_map принимает отображение (например, словарь) и не копирует его, что экономит память.

Форматирование чисел с плавающей точкой и экспоненциальной записью

Пример
number = 1234567.890123
print(f"Обычное: {number:.2f}")     # 1234567.89
print(f"Экспоненциальное: {number:.2e}")  # 1.23e+06
print(f"Общий формат: {number:.3g}")      # 1.23e+06 (3 значащие цифры)
Обычное: 1234567.89
Экспоненциальное: 1.23e+06
Общий формат: 1.23e+06

Вложенные фигурные скобки в f-строках (динамические спецификаторы)

Пример
width = 10
precision = 3
value = 3.14159265
print(f"{value:{width}.{precision}f}")
     3.142

Внутри f-строки можно использовать переменные, определяющие ширину и точность, помещая их во вложенные фигурные скобки.

Форматирование с помощью класса Formatter из модуля string

Пример
from string import Formatter
fmt = Formatter()
result = fmt.format("Привет, {name}!", name="Мир")
print(result)
Привет, Мир!

Класс Formatter позволяет создавать собственные правила форматирования, переопределяя методы.

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

En
Python format string (python)