Строковый метод 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))
Вывод будет следующий:
+12.230000 -12.230000
12.230000 -12.230000
12.230000 -12.230000
Форматирование чисел с выравниванием
Операторы <, ^, > и = используются для выравнивания в том случае, если указана конкретная ширина.
Форматирование чисел с выравниванием
| Тип | Значение |
|---|---|
| < | Выравнивается по левому краю |
| ^ | Выравнивается по центру |
| > | Выравнивается по правому краю |
| = | Сдвигает знаки (+ или -) к левой позиции |
Пример №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().
# определяем класс Person
class 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.
Пример №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+2j
print("Real part: {0.real} and Imaginary part: {0.imag}".format(complexNumber))
# пользовательский метод __format__()
class Person:
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 и !s
print("Quotes: {0!r}, Without Quotes: {0!s}".format("cat"))
# реализация для класса __str__() и __repr__()
class Person:
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







