Форматирование текста: f-строки, метод format и классический %
Форматирование строк в Python: выбор подходящего метода
Наиболее эффективный и современный способ форматирования строк в Python 3.6+ - это f-строки (f-strings). Синтаксис компактный и читаемый: переменные и выражения заключаются в фигурные скобки прямо внутри строки, перед которой ставится префикс f. Пример:
name = 'Анна'
age = 30
print(f'Меня зовут {name}, мне {age} лет.')формат текста python (форматирование строк в python)
Меня зовут Анна, мне 30 лет.
Внутри фигурных скобок можно использовать любые выражения, вызовы функций, арифметику, даже форматирование чисел и дат с помощью спецификаторов после двоеточия:
import math
print(f'Число Пи: {math.pi:.2f}')
Число Пи: 3.14
f-строки выполняются во время выполнения, но компилируются в байт-код, что делает их быстрыми и безопасными. Они поддерживают многострочные строки с тройными кавычками и экранирование фигурных скобок двойными скобками.
Как вставить переменные в строку с помощью метода format()?
До появления f-строк широко использовался метод str.format(). Он принимает позиционные или именованные аргументы, которые подставляются на места фигурных скобок с индексами или именами.
print('Меня зовут {}, мне {} лет.'.format('Анна', 30))
Меня зовут Анна, мне 30 лет.
print('Меня зовут {name}, мне {age} лет.'.format(name='Анна', age=30))
Меня зовут Анна, мне 30 лет.
Метод format() позволяет задавать выравнивание, ширину, точность для чисел, преобразования типов (!s, !r, !a).
Как использовать старый стиль форматирования с оператором %?
Оператор % (модуль строки) - самый старый способ, заимствованный из C. Строка содержит спецификаторы формата (например, %s, %d, %f), после оператора % указывается кортеж или словарь значений.
print('Меня зовут %s, мне %d лет.' % ('Анна', 30))
Меня зовут Анна, мне 30 лет.
Для нескольких значений требуется кортеж, для одного можно без скобок. Спецификаторы поддерживают ширину и точность: %10s, %.2f.
Типичные ошибки при форматировании строк
- Забытый префикс f: строка с фигурными скобками без f не вызовет ошибки, но переменные не подставятся - останутся фигурные скобки.
- Ошибка синтаксиса в выражении внутри f-строки: если внутри фигурных скобок написать невалидное выражение (например, {name = } в старых версиях Python), возникает SyntaxError.
- Использование несовместимых типов: передача числа в %s допустимо, но в %d вызовет TypeError, если число не целое.
- Экранирование фигурных скобок: чтобы вывести фигурные скобки, нужно использовать {{ и }} для f-строк и format().
Расширенные примеры форматирования строк
Вложенные f-строки и динамические спецификаторы
width = 10
precision = 3
value = 123.456789
print(f'{value:{width}.{precision}f}')
123.457
Форматирование даты и времени
from datetime import datetime
now = datetime.now()
print(f'Сегодня {now:%d.%m.%Y}, время {now:%H:%M}')
Сегодня 14.03.2025, время 10:30
Использование спецификаторов для разных систем счисления
n = 255
print(f'Десятичное: {n}, двоичное: {n:#b}, шестнадцатеричное: {n:#x}')
Десятичное: 255, двоичное: 0b11111111, шестнадцатеричное: 0xff
Выравнивание и заполнение
text = 'Привет'
print(f'{text:>20}')
print(f'{text:<20}')
print(f'{text:^20}')
print(f'{text:_>20}')
Привет
Привет
Привет
______________Привет
Метод format с преобразованием в repr
print('{!r} {!s}'.format('строка', 'строка'))
'строка' строка
Работа со словарями через format
data = {'name': 'Иван', 'age': 25}
print('Имя: {name}, Возраст: {age}'.format(**data))
Имя: Иван, Возраст: 25
Форматирование чисел с разделителями разрядов
big_number = 1234567
print(f'{big_number:,}') # для целых
print(f'{big_number:_.2f}') # для float с подчёркиванием
1,234,567 1_234_567.00
Использование тройных кавычек с f-строкой
name = 'Мария'
text = f'''
Привет, {name}!
Это многострочное сообщение.
'''
print(text)
Привет, Мария! Это многострочное сообщение.
Комбинирование f-строки и метода format()
Хотя обычно используют что-то одно, можно встретить такой код (не рекомендуется, но возможно):
template = f'Привет, {{name}}'
print(template.format(name='Лена'))
Привет, Лена
Форматирование процентов
share = 0.2534
print(f'Доля: {share:.1%}')
Доля: 25.3%
Динамическое форматирование с помощью словаря спецификаторов
format_spec = {'name': '>10', 'age': '<5'}
person = {'name': 'Анна', 'age': 30}
print('{name:{fmt[name]}} {age:{fmt[age]}}'.format(**person, fmt=format_spec))
Анна 30