В этом уроке по основам Python мы рассмотри форматирование строк с помощью метода format()
.
В языке Python есть 4 способа форматирования строк:
- Строковый оператор форматирования
- Метод format() (эта статья)
- f-Строки
- Шаблонные строки
С приходом Python 3 появился новый метод форматирования строк - format()
.
Он более удобен и гибок, чем строковый оператор форматирования
Конечно у данного способа есть и минусы: работает он медленнее, что, в некоторых ситуациях, бывает критично.
Метод format()
принимает любое количество аргументов. Делятся они на следующие типы:
- Позиционные аргументы - список параметров, к которым можно получить доступ через индекс параметра в фигурных скобках
{index}
. - Аргументы - ключевые слова - список параметров ключ=значение, доступ к которым осуществляется с помощью ключевого параметра в фигурных скобках
{ключ}
.
Формат считывает тип переданных аргументов и форматирует строку в соответствии с кодами формата в строке.
Давайте рассмотрим примеры использования format():
Позиционирование с заданными индексами:
string = 'Hello, {0}, which city are you heading to? - Im going to {1}!'.format('Vladislav', 'Moscow')
print(string)
Результат:
>>> Hello, Vladislav, which city are you heading to? - Im going to Moscow!
Мы воспользовались явными индексами. Но что будет, если мы не будем указывать индексы?
string = 'Hello, {}, which city are you heading to? - Im going to {}!'.format('Vladislav', 'Moscow')
print(string)
Результат:
>>> Hello, Vladislav, which city are you heading to? - Im going to Moscow!
Если не использовать индексы явно, то Python сделает это сам, вставляя аргументы по порядку их перечисления:
Рассмотрим пример именованных аргументов:
string = 'I would like to invite {name} on a date to the restaurant "{restaurant}".'.format(name='Natalia', restaurant='By the Sea')
print(string)
Результат:
>>> I would like to invite Natalia on a date to the restaurant "By the Sea".
Также можно использовать смешанное форматирование:
string = 'Hello, {}. You are at a depth of {meters:d} meters.'.format('Alexander', meters=800)
print(string)
Результат:
>>> Hello, Alexander. You are at a depth of 800 meters.
Примечание: если передать методу меньше аргументов, чем указано, интерпретатор вернёт исключение: IndexError: Replacement index 1 out of range for positional args tuple
Таблица форматирования чисел:
Тип | Значение |
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 и добавляет % в конце |
Пример с форматированием чисел:
# Целочисленные значения
print("The number is:{:d}".format(23))
# Число с плавающей точкой
print("The float number is:{:f}".format(23.5))
# Восьмеричный, Двоичный и Шестнадцатеричный формат
print("bin: {0:b}, oct: {0:o}, hex: {0:x}".format(23))
Результат:
>>> The number is:23
>>> The float number is:23.500000
>>> bin: 10111, oct: 27, hex: 17
Форматирование чисел с полями для целых и чисел с плавающей точкой:
# Целые числа с минимальной шириной
print("{:5d}".format(23))
# Ширина не работает для чисел длиннее заполнения
print("{:2d}".format(2393))
# Заполнение для чисел с плавающей точкой
print("{:8.3f}".format(23.3024))
# Целые числа с минимальной шириной, заполненные нулями
print("{:05d}".format(23))
# Заполнение для чисел с плавающей запятой, заполненных нулями
print("{:08.3f}".format(23.3043))
Результат:
>>> 23
>>> 2393
>>> 23.302
>>> 00023
>>> 0023.304
форматирование чисел со знаками:
# Показать знак +
print("{:+f} {:+f}".format(23.25, -23.25))
# Показать знак -
print("{:-f} {:-f}".format(23.25, -23.25))
# Показать место для знака +
print("{: f} {: f}".format(23.25, -23.25))
Результат:
>>> +23.250000 -23.250000
>>> 23.250000 -23.250000
>>> 23.250000 -23.250000
Форматирование чисел с выравниванием
Тип | Значение |
< | Выравнивается по левому краю |
^ | Выравнивается по центру |
> | Выравнивается по правому краю |
= | Сдвигает знаки (+ или -) к левой позиции |
# Целые числа с выравниванием по правому краю
print("{:5d}".format(24))
# Числа с плавающей точкой с выравниванием по центру
print("{:^10.3f}".format(24.2398))
# Выравнивание целого числа по левому краю заполнено нулями
print("{:<05d}".format(24))
# Числа с плавающей точкой с выравниванием по центру
print("{:=8.3f}".format(-24.9824))
Результат:
>>> 24
>>> 24.240
>>> 24000
>>> - 24.982
Такие же методы выравнивания применяются и для строк.
# Отступ строки с выравниванием по левому краю
print("{:5}".format("Dog"))
# Отступ строки с выравниванием по правому краю
print("{:>5}".format("Dog"))
# Заполнение строк с выравниванием по центру
print("{:^5}".format("Dog"))
# Заполнение строк с выравниванием по центру
# И '*' - символ заполнения
print("{:*^5}".format("Dog"))
Результат:
>>> Dog
>>> Dog
>>> Dog
>>> *Dog*
Пример обрезания строк:
# Обрезание строк до 4 букв
print("{:.4}.".format('Hello'))
# Обрезание строк до 4 букв и заполнение
print("{:5.4}.".format("Hello"))
# Обрезание строк до 4 букв,
# Заполнение и выравнивание по центру
print("{:^5.4}.".format("Hello"))
Результат:
>>> Hell.
>>> Hell .
>>> Hell .
Форматирование элементов классов и словарей с format()
# Задаем класс Student
class Student:
name = 'Vladislav'
age = 23
# Форматируем с помощью format
print("{student.name} age is: {student.age}".format(student=Student()))
Результат:
>>> Vladislav age is: 23
Со словарем:
# Объявляем словарь student
student_dict = {'age': 23, 'name': 'Vladislav'}
# Форматирование возраста
print('{student[name]} age is: {student[age]}'.format(student=student_dict))
Результат:
>>> Vladislav age is: 23
Аргументы как параметры в format()
В качестве аргументов ключевого слова можно передавать такие параметры, как точность, выравнивание или символы заполнения.
# Динамический шаблон формата строки
string = "{:{fill}{align}{width}}"
# Передача кодов формата в качестве аргументов
print(string.format('Vladislav', fill='*', align='^', width=5))
# Динамический шаблон формата float
num = "{:{align}{width}.{precision}f}"
# Передача кодов формата в качестве аргументов
print(num.format(23.98, align='<', width=8, precision=2))
Результат:
>>> Vladislav
>>> 23.98
Пояснение:
- В первом пример
Vladislav
— это позиционный аргумент, который будет отформатирован. Аналогично fill='*', align='^' и width=5 являются аргументами-ключевыми словами. - В шаблоне строки эти аргументы извлекаются не как обычные строки для вывода, а как коды форматирования: fill, align и width.
- Эти аргументы заменяют соответствующие заполнители, а строка
Vladislav
соответствующим образом форматируется. - Во втором примере
23.98
— это позиционный аргумент, а align, with и precision передаются в шаблон в качестве параметров форматирования.
Дополнительные параметры форматирования с format()
format()
также поддерживает форматирования по типам, например, для datetime
или форматирование сложных чисел. Он внутренне вызывает __format__()
для datetime
и получает доступ к атрибутам сложных чисел.
import datetime
# datetime форматирование
date = datetime.datetime.now()
print("It's now: {:%Y/%m/%d %H:%M:%S}".format(date))
# Форматирование комплексных чисел
complexNumber = 3 + 2j
print('Real part: {0.real} and Imaginary part: {0.imag}'.format(complexNumber))
# Пользовательский метод __format__()
class Student:
def __format__(self, format):
if format == 'age':
return '23'
return 'None'
print('Vladislav age is: {:age}'.format(Student()))
Результат:
>>> It's now: 2022/10/16 18:52:49
>>> Real part: 3.0 and Imaginary part: 2.0
>>> Vladislav age is: 23
Пояснение:
- Для
datetime
: текущий объектdatetime
передается в качестве позиционного аргумента в методformat()
. С помощью метода__format__()
функцияformat()
получает доступ к году, месяцу, дню, часу, минуте и секунде. - Для комплексных чисел:
3+2j
преобразуется в объектComplexNumber
. Затем числа форматируются с помощью доступа кreal
атрибутам и атрибутамimag
. - Переопределение
format():
Как и в случае сdatetime
, вы можете переопределить метод__format__()
своим собственным форматированием, которое будет возвращать возраст при доступе через{:age}
.
Подобно __format__()
, вы можете легко переопределить методы __str__()
и __repr__()
у объекта.
Условные обозначения 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
Источником послужил сайт pythonru.com