ГлавнаяОсновыФорматирование в Python с помощью format()
Форматирование в Python с помощью format()
Строковый метод format() форматирует строки python для более красивого вывода.
Синтаксис метода:
template.format(p0, p1,..., k0=v0, k1=v1,...)
Здесь p0, p1,... — это позиционные аргументы, а k0, k1,... — аргументы-ключевые слова со значениями v0, v1,... соответственно.
А template — это набор строк с заполнителями для аргументов.
Параметры format()
Метод format() принимает любое количество параметров. Но они делятся на два вида:
Позиционные аргументы — список параметров, доступ к которым можно получить по индексу параметра в фигурных скобках {индекс}.
Параметры — ключевые слова — список параметров типа ключ=значение, доступ к которым можно получить с помощью ключа параметра в фигурных скобках {ключ}.
Возвращаемое значение format()
Метода format() возвращает отформатированную строку.
Как работает format()?
Формат читает тип переданных аргументов и форматирует строку в соответствии с кодами форматирования в строке.
Для позиционных аргументов
Здесь Аргумент 0 — это строка “Adam”, а Аргумент 1 — число с плавающей точкой 230.2346.
Список аргументов в Python начинается с 0.
Строка Hello {0}, your balance is {1:9.3f} — это шаблон строки. Он содержит коды форматирования.
Фигурные скобки — это всего лишь заполнители, которые будут заменены аргументами. В примере выше {0} — это заполнитель для "Adam", а {1:9.3f} — для 230.2346.
Поскольку шаблон строки ссылается на аргументы format() ({0} и {1}), они являются позиционными аргумента. На них можно ссылаться без использования чисел, а Python конвертирует {} в числа автоматически.
Что происходит:
Поскольку "Adam" — это нулевой аргумент, он располагается в позиции {0}. Поскольку {0} не содержит других кодов форматирования, дополнительные операции не осуществляются.
Но в случае с первым аргументом, 230.2346, ситуация другая. {1:9.3f} размещает 230.2346 на нужно месте и выполняет операцию 9.3f.
f определяет, что это формат числа с плавающей точкой. Если указать неправильно, будет ошибка.
Часть до точки (9) определяет минимальную ширину, которую может занимать число 230.2346. В этом случае числу 230.2346 выделены 9 мест с точкой. Если параметр выравнивания не указан, то он выравнивается вправо до оставшихся позиций (для строк — влево).
Часть после точки (3) урезает десятичную часть (2346) до указанной числа. В этом случае 2346 может занимать три места. Остаток (46) округляется и выходит 235.
Для аргументов-ключевых слов
В этом примере используется то же выражение, чтобы продемонстрировать разницу в использовании позиционных и аргументов-ключевых слов.
Здесь вместо просто параметров использованы сочетания ключ-значение. А именно: name="Adam" и blc=230.2346.
Поскольку ссылка на эти параметры происходит через ключи ({name} и {blc:9.3f}) — это именованные аргументы.
Что происходит внутри:
Заполнитель {name} заменяется значением ключа name — “Adam”. Никаких дополнительных операций здесь нет.
В случае с аргументом blc=230.2346 заполнитель {blc:9.3f} заменяется на значение 230.2346. Но перед заменой производится операция 9.3f. Вывод — “230.235”. Десятичная часть обрезается после трех позиций, а оставшиеся цифры округляются. Общая ширина — 9, а два символа остаются справа.
Базовое форматирование с format()
Метод format() позволяет использовать простые заполнители для форматирования.
Пример №1: базовое форматирование для аргументов по умолчанию, позиционных и аргументов-ключевых слов.
# аргументы по умолчаниюprint("Hello {}, your balance is {}.".format("Adam",230.2346))# позиционные аргументыprint("Hello {0}, your balance is {1}.".format("Adam",230.2346))# аргументы ключевые слова print("Hello {name}, your balance is {blc}.".format(name="Adam", blc=230.2346))# смешанные аргументыprint("Hello {0}, your balance is {blc}.".format("Adam", blc=230.2346))
При запуске программы вывод будет одинаковым:
Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.
При использовании смешанных аргументов аргументы-ключевые слова должны идти после позиционных аргументов.
Форматирование чисел с format()
С помощью спецификаторов формата можно форматировать и числа:
Типы форматирования чисел
Тип
Значение
d
Десятичное число
c
Соответствующий символ Unicode
b
Двоичный формат
o
Восьмеричный формат
x
Шестнадцатеричный формат (в нижнем регистре)
X
Шестнадцатеричный формат (в верхнем регистре)
n
То же, что и d, но использует местную настройку для разделения числа
e
Экспоненциальная запись (e в нижнем регистре)
E
Экспоненциальная запись (E в верхнем регистре)
f
Отображать фиксированное количество знаков (по умолчанию 6)
F
То же, что и f, только отображает inf как INF, а nan как NAN
g
Общий формат. Округляет число до p значащих цифр (Точность по умолчанию: 6)
G
То же, что и g. Но переключается к E, если число очень большое
%
Проценты. Делит на 100 и добавляет % в конце
Пример №2: простое форматирование чисел.
# целочисленные аргументыprint("The number is:{:d}".format(123))# аргументы с плавающей точкойprint("The float number is:{:f}".format(123.4567898))# восьмеричный, двоичный и шестнадцатеричный форматprint("bin: {0:b}, oct: {0:o}, hex: {0:x}".format(12))
При запуске этой программы вывод будет следующий:
The number is: 123
The number is:123.456790
bin: 1100, oct: 14, hex: c
Пример №3: форматирование чисел с полями для целых и чисел с плавающей точкой.
# целые числа с минимальной ширинойprint("{:5d}".format(12))# ширина не работает для чисел длиннее заполненияprint("{:2d}".format(1234))# заполнение для чисел с плавающей точкойprint("{:8.3f}".format(12.2346))# целые числа с минимальной шириной, заполненные нулямиprint("{:05d}".format(12))# заполнение для чисел с плавающей запятой, заполненных нулямиprint("{:08.3f}".format(12.2346))
Эта программа выдаст следующее:
12
1234
12.235
00012
0012.235
Здесь:
В первой инструкции {:5d} принимает целое число в качестве аргумента и задает минимальную ширину 5. Поскольку настройка выравнивания не задана, оно выравнивается к правому краю.
Во втором ширина (2) меньше, чем размер числа (1234), поэтому слева не появляется свободное пространство, но число и не обрезается.
В отличие от целых чисел у чисел с плавающей точкой есть целая и десятичная части. Минимальная ширина в этом случае включает обе из них и точку.
В третьем выражении {:8.3f} обрезает десятичную часть, округляя ее до 2 цифр. И число, теперь 12.235, занимает 8 позиций, оставляя 2 пустых местах слева.
Если нужно заполнить оставшиеся места нулями, спецификатор может сделать и это. Это работает как для целых чисел, так и для чисел с плавающей точкой: {:05d} и {:08.3f}.
Пример №4: форматирование чисел со знаками.
# показать знак +print("{:+f} {:+f}".format(12.23,-12.23))# показать знак - print("{:-f} {:-f}".format(12.23,-12.23))# показать место для знака +print("{: f} {: f}".format(12.23,-12.23))
Операторы <, ^, > и = используются для выравнивания в том случае, если указана конкретная ширина.
Форматирование чисел с выравниванием
Тип
Значение
<
Выравнивается по левому краю
^
Выравнивается по центру
>
Выравнивается по правому краю
=
Сдвигает знаки (+ или -) к левой позиции
Пример №5: форматирование чисел с выравниванием по центру, левому и правому краю.
# целые числа с выравниванием по правому краюprint("{:5d}".format(12))# числа с плавающей точкой с выравниванием по центруprint("{:^10.3f}".format(12.2346))# выравнивание целого числа по левому краю заполнено нулямиprint("{:<05d}".format(12))# числа с плавающей точкой с выравниванием по центруprint("{:=8.3f}".format(-12.2346))
Вывод этой программы:
12
12.235
12000
- 12.235
Выравнивание по левому краю с нулями для целых чисел может создать проблемы, как в случае с третьим примером, который возвращает 12000 вместо 12.
Форматирование строк с format()
Как и числа, строки можно форматировать с помощью format().
Пример №6: форматирование строк с полями и выравниванием.
# отступ строки с выравниванием по левому краюprint("{:5}".format("cat"))# отступ строки с выравниванием по правому краюprint("{:>5}".format("cat"))# заполнение строк с выравниванием по центруprint("{:^5}".format("cat"))# заполнение строк с выравниванием по центру# и '*' - символ заполненияprint("{:*^5}".format("cat"))
При запуске программы вывод будет следующим:
cat
cat
cat
*cat*
Пример №7: обрезание строк.
# обрезание строк до 3 буквprint("{:.3}.".format("caterpillar"))# обрезание строк до 3 букв и заполнениеprint("{:5.3}.".format("caterpillar"))# обрезание строк до 3 букв,# заполнение и выравнивание по центруprint("{:^5.3}.".format("caterpillar"))
Вывод будет следующим:
cat.
cat .
cat .
Форматирование элементов классов и словарей с format()
Python использует getattr() для элементов класса в форме “.age”. А __getitem__() — для элементов словаря в форме “[index]”.
Пример №8: форматирование элементов класса с format().
# определяем класс PersonclassPerson:
age =23
name ="Adam"# форматирование возрастаprint("{p.name}'s age is: {p.age}".format(p=Person()))
Вывод этой программы:
Adam's age is: 23
Здесь объект Person передается как аргумент-ключевое слово p.
В шаблоне строки получают доступ к значениям name и age с помощью .name и .age.
Пример №9: форматирование элементов словаря с format().
# объявляем словарь person
person ={'age':23,'name':'Adam'}# форматирование возрастаprint("{p[name]}'s age is: {p[age]}".format(p=person))
Вывод:
Adam's age is: 23
По аналогии с классом словарь person передается в качестве аргумента-ключевого слова p.
В шаблоне строки доступ к name и age получают с помощью [name] и [age].
Есть и более простой способ форматировать словари в Python с помощью str.fromat(**mapping).
# объявляем словарь person
person ={'age':23,'name':'Adam'}# форматирование возрастаprint("{name}'s age is: {age}".format(**person))
Вывод:
Adam's age is: 23
* — это параметр формата (минимальная ширина поля).
Аргументы как параметры в format()
Параметры, такие как точность, выравнивание или символы заполнения можно передавать в качестве позиционных аргументов-ключевых слов.
Пример №10: динамическое форматирование.
# динамический шаблон формата строки
string ="{:{fill}{align}{width}}"# передача кодов формата в качестве аргументовprint(string.format('cat', fill='*', align='^', width=5))# динамический шаблон формата float
num ="{:{align}{width}.{precision}f}"# передача кодов формата в качестве аргументовprint(num.format(123.236, align='<', width=8, precision=2))
Вывод:
*cat*
123.24
Здесь:
В первом пример “cat” — это позиционный аргумент, который будет отформатирован. Аналогично fill='*', align='^' и width=5 являются аргументами-ключевыми словами.
В шаблоне строки эти аргументы извлекаются не как обычные строки для вывода, а как коды форматирования: fill, align и width. Эти аргументы заменяют соответствующие заполнители, а строка “cat” соответствующим образом форматируется.
Во втором примере 123.236 — это позиционный аргумент, а align, with и precision передаются в шаблон в качестве параметров форматирования.
Дополнительные параметры форматирования с format()
format() также поддерживает форматирования по типам, например, для datetime или форматирование сложных чисел. Он внутренне вызывает __format__() для datetime и получает доступ к атрибутам сложных чисел.
Можно запросто переопределить метод __format__() для любого объекта для создания собственного форматирования.
Пример №11: форматирование по типу с format() и переопределение метода _format().
import datetime
# datetime форматирование
date = datetime.datetime.now()print("It's now: {:%Y/%m/%d %H:%M:%S}".format(date))# форматирование комплексных чисел
complexNumber =1+2jprint("Real part: {0.real} and Imaginary part: {0.imag}".format(complexNumber))# пользовательский метод __format__()classPerson:def__format__(self,format):if(format=='age'):return'23'return'None'print("Adam's age is: {:age}".format(Person()))
Вывод:
It's now: 2020/01/18 12:19:24
Real part: 1.0 and Imaginary part: 2.0
Adam's age is: 23
Здесь
Для datetime: Текущий объект datetime передается в качестве позиционного аргумента методу format(). С помощью метода __format__()format() получает доступ к году, месяцу, дню, часу, минутам и секундам.
Для сложны чисел: 1+2j конвертируется в объект ComplexNumber. Затем через доступ к атрибутам real и imag числа форматируются.
Переопределение format(): Как и с datetime можно перезаписать метод __format__() для собственного форматирования, которое вернет возраст при попытке получить доступ через {:age}.
Также можно использовать функциональность __str__() и __repr__() объекта с условными обозначениями и format().
Как и __format__() можно запросто переопределять метода __str__() и __repr__() объекта.
Пример №12: условные обозначения str() и repr() (!r и !s) с format().
# __str__() и __repr__() сокращенно !r и !sprint("Quotes: {0!r}, Without Quotes: {0!s}".format("cat"))# реализация для класса __str__() и __repr__()classPerson:def__str__(self):return"STR"def__repr__(self):return"REPR"print("repr: {p!r}, str: {p!s}".format(p=Person()))
Вывод:
Quotes: 'cat', Without Quotes: cat
repr: REPR, str: STR