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

Опубликован: 10.08.2023 175

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

Наиболее часто f-string применяют для красивого вывода в строку нескольких переменных, используя стандартный синтаксис вставки значений переменных с помощью { } фигурных скобок.

Но, у f-string есть и малоизвестные способы применения, которые значительно упрощают форматирование вывода таких объектов, как datatime, float с ограничением количества десятичных знаков, денежных значений, заполнения целых чисел ведущими нулями или пробелами и многое другое.

Мини-язык форматирования Python включает в себя гораздо больше, чем конструкции, рассчитанные на форматирование чисел и дат. Этот язык, кроме прочего, позволяет выравнивать или центрировать текст, добавлять к строкам начальные нули или пробелы, задавать разделители групп разрядов и многое другое.

Использование f-строки для вывода нескольких переменных.

Стандартный способ применения f-string - вставка в выводимую строку значений переменных с помощью { } фигурных скобок:

first_name, last_name, age = 'Александр', 'Пушкин', 31
print(f'Имя: {first_name}, Фамилия: {last_name}, Возраст: {age}')

Имя: Александр, Фамилия: Пушкин, Возраст: 31

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

Фигурные скобки внутри f-строки имеют большие возможности: внутри них можно вызывать функции, элементы списков и словарей, а также выполнять операции — нужно просто вставить соответствующие выражения:

# выполнение математических операций
num = 5
print(f'{num} в квадрате равно {num * num}')
# Вывод
5 в квадрате равно 25

# вызов элементов словаря
dict = {'name': 'Владимир', 'profession': 'программист'}
print(f"{dict['name']} - это наш {dict['profession']}.")
# Вывод
Владимир - это наш программист.

Важно использовать разные кавычки: для f-string двойные, а для ключей словаря одинарные, иначе Python выдаст синтаксическую ошибку.

Выравнивание объекта float и знаки после запятой

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

# Общий синтаксис:
f'{value:{width}.{precision}}'

Значение value, двоеточие :, затем ширина строки {width} в фигурных скобках, точка ., требуемая точность {precision} в фигурных скобках.

# точность вывода числового значения:
pi = 3.14159265
print(f'{pi:.2f}')
3.14

Если в параметре precision указать 2f, то значение выводится с двумя знаками после запятой. Буква f в данном случае означает fractional part, то есть дробную часть числа.

Если оставить просто 2, то значение целиком — и целая, и дробная часть — будет занимать два знака (точка не считается):

print(f'{pi:.2}')
3.1

Выравнивание значений с помощью параметра width

В f-string параметр {width}, в фигурных скобках после двоеточия и перед . точкой, определяет ширину строки, выделенной под значение, и выравнивание в ней:

print(f'{5:<5}₽')  # ширина 5 символов с выравниванием влево `<`
5   
print(f'{5:>5}₽')  # ширина 5 символов с выравниванием вправо `>`
      5
print(f'{5:^5}₽')  # ширина 5 символов с выравниванием по центру `^`
  5  

# печать трех колонок: первая шириной в 2 символа (с заполнением коротких 
# значений нулями), вторая в 3 символа, третья в 4 символа

for x in range(1, 11):
    print(f'{x:02} {x*x:3} {x*x*x:4}')

01   1    1
02   4    8
03   9   27
04  16   64
05  25  125
06  36  216
07  49  343
08  64  512
09  81  729
10 100 1000

Если не указать направление выравнивания < или >, то строка по умолчанию будет выравниваться по левому краю <, а числа по правому >.

Преобразование float в “красивый” денежный формат

Для вывода в f-string больших числовых значений в денежном формате используется способ с указанием разделителя разрядов числа.

Если необходимо "красиво" вывести денежную сумму 3142671.7623, то в качестве разделителя разрядов можно указать после двоеточия : запятую , или нижнее подчеркивание _ и далее количество десятичных знаков (например, два знака .2f).

money = 3142671.7623

# разделение числовых разрядов запятыми
print(f"${money:,.2f}")
# $3,142,671.76

# разделение числовых разрядов пробелами 
print(f"${money:_.2f}".replace('_', ' '))
# $3 142 671.76

Заполнение int ведущими нулями или пробелами

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

# печать 20-ти значных чисел с заполнением ведущих позиций нулями 
int_val = 1234567
print(f'{int_val:020}')
00000000000001234567

# печать 10-ти значных чисел с заполнением ведущими пробелами 
int_val = 2023
print(f'{int_val:10d}')
      2023

Преобразование float в процентный формат

В f-string с помощью спецификатора % можно вывести десятичные значения в формате процентов, например:

value = 1/7.0
print(f"{value}")
0.14285714285714285

print(f"{value:.2%}")  # в процентном формате
14.29%

print(f"{value:10.3%}")  # в процентном формате шириной 10 и 3 десятичных знака
   14.286%

Форматирование объектов datetime

В f-string очень удобно форматировать вывод объектов datetime с помощью спецификаторов даты и времени с использованием символов %, которые указываются после двоеточия :.

Для форматирования вывода дат и времени применяются спецификаторы в виде строковых форматов (указываемых после символа %):

from datetime import datetime

today = datetime.today()       # текущее значение даты и времени

# вывод полной информации о текущей дате и времени
print(f"Сегодня: {today}")
Сегодня: 2023-09-16 13:12:22.705607

# вывод даты в формате (дд-месяц-ГГГГ)
print(f"{today:%d-%B-%Y}")
16-September-2023

# вывод даты и времени в формате (дд-мм-ГГГГ ЧЧ:ММ)
print(f"{today:%d-%m-%Y %H:%M}")
16-09-2023 13:18

Cписок кодов форматирования, которые работают на всех платформах со стандартной реализацией языка C.

  • %a - Сокращенное название дня недели в локали (по умолчанию: Sun, Mon, …, Sat);
  • %A - Полное название дня недели в локали (по умолчанию: Sunday, Monday, …, Saturday);
  • %w - День недели как число, где 0 это Воскресение и 6 — суббота (0, 1, …, 6);
  • %d - День месяца в виде десятичного числа с нулем (01, 02, …, 31);
  • %b - Месяц как сокращенное название в локали (по умолчанию: Jan, Feb, …, Dec);
  • %B - Месяц как полное название в локали (по умолчанию: January, February, …, December);
  • %m - Месяц в виде десятичного числа с добавлением нуля (01, 02, …, 12);
  • %y - Год без столетия как десятичное число с нулем (00, 01, …, 99);
  • %Y - Год с веком как десятичное число (0001, 0002, …, 2013, 2014, …, 9998, 9999);
  • %H - Час (24-часовой формат) в виде десятичного числа с добавлением нуля (00, 01, …, 23);
  • %I - Час (12-часовые часы) в виде десятичного числа с добавлением нуля (01, 02, …, 12);
  • %p - Локальный эквивалент либо AM, либо PM (AM, PM);
  • %M - Минута как десятичное число с добавлением нуля (00, 01, …, 59);
  • %S - Секунда как дополненное нулями десятичное число (00, 01, …, 59);
  • %f - Микросекунда как десятичное число, дополненное нулями слева (000000, 000001, …, 999999);
  • %z - Смещение UTC в форме ±HHMM[SS[.ffffff]] или пустая строка, если объект наивный (+0000, -0400, +1030, +063415, -030712.345216);
  • %Z - Имя часового пояса или пустая строка, если объект наивный (UTC, EST, CST);
  • %j - День года в виде десятичного числа с нулем (001, 002, …, 366);
  • %U - Номер недели в году (воскресенье - первый день недели) в виде десятичного числа с добавлением нуля. Все дни в новом году, предшествующем первому воскресенью, считаются на неделе 0 (00, 01, …, 53);
  • %W - Номер недели в году (понедельник - первый день недели) в виде десятичного числа. Все дни в новом году, предшествующем первому понедельнику, считаются на неделе 0 (00, 01,…, 53);
  • %c - Соответствие локали дате и времени (Tue Aug 16 21:30:00 1988)
  • %x - Соответствующее представление даты локали (08/16/88 (None); 08/16/1988 (en_US);
  • %X - Соответствующее время локали (21:30:00);
  • %% - Буквальный символ '%' (%);

Похожие посты

Оценка основных статистических метрик набора данных в Python

Область эффективного использования lambda функции в Python

Логические выражения if ... else в Pythonic стиле

Способы удаления лишних пробелов в строке

Комментариев нет.