Форматирование строк#
При работе со строками часто возникают ситуации, когда в шаблон строки надо подставить разные данные.
Это можно делать объединяя, части строки и данные, но в Python есть более удобный способ — форматирование строк.
Форматирование строк может помочь, например, в таких ситуациях:
необходимо подставить значения в строку по определенному шаблону
необходимо отформатировать вывод столбцами
надо конвертировать числа в двоичный формат
Существует несколько вариантов форматирования строк:
с оператором
%
— более старый вариантметод
format()
— относительно новый вариантf-строки — новый вариант, который появился в Python 3.6.
Несмотря на то, что рекомендуется использовать метод format
, часто
можно встретить форматирование строк и через оператор %
.
Предупреждение
Так как для полноценного объяснения f-строк, надо показывать примеры с циклами и работой с объектами, которые еще не рассматривались, это тема рассматривается в разделе Форматирование строк с помощью f-строк с дополнительными примерами и пояснениями.
Форматирование строк с методом format#
Пример использования метода format:
In [1]: "interface FastEthernet0/{}".format('1')
Out[1]: 'interface FastEthernet0/1'
Специальный символ {}
указывает, что сюда подставится значение,
которое передается методу format. При этом каждая пара фигурных скобок
обозначает одно место для подстановки.
Значения, которые подставляются в фигурные скобки, могут быть разного типа. Например, это может быть строка, число или список:
In [3]: print('{}'.format('10.1.1.1'))
10.1.1.1
In [4]: print('{}'.format(100))
100
In [5]: print('{}'.format([10, 1, 1,1]))
[10, 1, 1, 1]
С помощью форматирования строк можно выводить результат столбцами. В форматировании строк можно указывать, какое количество символов выделено на данные. Если количество символов в данных меньше, чем выделенное количество символов, недостающие символы заполняются пробелами.
Например, таким образом можно вывести данные столбцами одинаковой ширины по 15 символов с выравниванием по правой стороне:
In [3]: vlan, mac, intf = ['100', 'aabb.cc80.7000', 'Gi0/1']
In [4]: print("{:>15} {:>15} {:>15}".format(vlan, mac, intf))
100 aabb.cc80.7000 Gi0/1
Выравнивание по левой стороне:
In [5]: print("{:15} {:15} {:15}".format(vlan, mac, intf))
100 aabb.cc80.7000 Gi0/1
Примеры выравнивания



Шаблон для вывода может быть и многострочным:
ip_template = '''
IP address:
{}
'''
In [7]: print(ip_template.format('10.1.1.1'))
IP address:
10.1.1.1
С помощью форматирования строк можно также влиять на отображение чисел.
Например, можно указать, сколько цифр после запятой выводить:
In [9]: print("{:.3f}".format(10.0/3))
3.333
С помощью форматирования строк можно конвертировать числа в двоичный формат:
In [11]: '{:b} {:b} {:b} {:b}'.format(192, 100, 1, 1)
Out[11]: '11000000 1100100 1 1'
При этом по-прежнему можно указывать дополнительные параметры, например, ширину столбца:
In [12]: '{:8b} {:8b} {:8b} {:8b}'.format(192, 100, 1, 1)
Out[12]: '11000000 1100100 1 1'
А также можно указать, что надо дополнить числа нулями, вместо пробелов:
In [13]: '{:08b} {:08b} {:08b} {:08b}'.format(192, 100, 1, 1)
Out[13]: '11000000 01100100 00000001 00000001'
В фигурных скобках можно указывать имена. Это позволяет передавать аргументы в любом порядке, а также делает шаблон более понятным:
In [15]: '{ip}/{mask}'.format(mask=24, ip='10.1.1.1')
Out[15]: '10.1.1.1/24'
Еще одна полезная возможность форматирования строк - указание номера аргумента:
In [16]: '{1}/{0}'.format(24, '10.1.1.1')
Out[16]: '10.1.1.1/24'
За счет этого, например, можно избавиться от повторной передачи одних и тех же значений:
ip_template = '''
IP address:
{:<8} {:<8} {:<8} {:<8}
{:08b} {:08b} {:08b} {:08b}
'''
In [20]: print(ip_template.format(192, 100, 1, 1, 192, 100, 1, 1))
IP address:
192 100 1 1
11000000 01100100 00000001 00000001
В примере выше октеты адреса приходится передавать два раза - один для отображения в десятичном формате, а второй - для двоичного.
Указав индексы значений, которые передаются методу format, можно избавиться от дублирования:
ip_template = '''
IP address:
{0:<8} {1:<8} {2:<8} {3:<8}
{0:08b} {1:08b} {2:08b} {3:08b}
'''
In [22]: print(ip_template.format(192, 100, 1, 1))
IP address:
192 100 1 1
11000000 01100100 00000001 00000001