Форматирование строк. Метод format

Иногда (а точнее, довольно часто) возникают ситуации, когда нужно сделать строку, подставив в неё некоторые данные, полученные в процессе выполнения программы (пользовательский ввод, данные из файлов и т. д.). В этом случае для подстановки этих значений можно использовать строковый метод format. При этом в шаблоне в места подстановок нужно поставить якори вида {}, а в параметры format передать ровно необходимое количество значений. Однако возможностей у format гораздо больше: кроме непосредственной подстановки в строку возможно применение форматирования в выводимым данным. Полный список возможностей можно получить непосредственно в документации, а здесь будет список разумных примеров использования этого метода:

>>> '{}, {}, {}'.format('a', 'b', 'c')
'a, b, c'
>>> '{0}, {1}, {2}'.format('a', 'b', 'c')  # Можно явно указать индексы
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')  # Если индексы указаны явно, то они могут идти в любом порядке
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')  # И даже повторяться
'abracadabra'
>>> 'Coordinates: {lat}, {lon}'.format(lat='37.24N', lon='-115.81W')  # Можно вместо индексов явно указывать имена
'Coordinates: 37.24N, -115.81W'

# Выравнивания
>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # Используем * для заполнения
'***********centered***********'

# Особый вывод действительных чисел
>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # Всегда показывать знак
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)  # Или выводить пробел, если знака плюса нет
' 3.140000; -3.140000'
>>> '{:0.2f}; {:0.3f}; {:0.3f}'.format(3.14, -3.14, 179e-4)  # Можно выводить фиксированное кол-во значащих цифр
'3.14; -3.140;    0.018'

# Вывод в двоичной, восьмеричной или шестнадцатиричной системе счисления
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)  # С префиксом 0x, 0o, 0b
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

f-строки

Начиная с Python 3.6 появился ещё один способ получения строк, в которые вставлены значения некоторых переменных. Кроме того, что этот способ очень хорошо читается, он ещё и самый быстрый. Начнём с примера:

>>> x = 10
>>> y = 5
>>> print(f"{x} x {y} / 2 = {x * y / 2}")
>>> 10 x 5 / 2 = 25.0

>>> planets = ["Меркурий", "Венера", "Земля", "Марс"]
>>> print(f"Мы живём не планете {planets[2]}")
>>> Мы живём не планете Земля
В целом этот подход очень похож на использование метода .format, только необходимо всегда указывать префикс f перед строкой и имена переменных внутри фигурных скобок. Возможностей того, что можно указывать внутри фигурных скобок достаточно много: pep-0498.

Задачи на форматирование строк


S★: Пять цифр после запятой

На вход даются десятичные числа. Необходимо вывести их с точностью 5 цифрами после запятой.

На вход даётся число N, затем следуют N действительных чисел.

3
-2
12.123
12.123456
-2.00000
12.12300
12.12346
IDE

T★: Фиксированное число цифр после запятой

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

На вход даётся число d — количество знаков, после запятой, которые нужно выводить. Затем идёт число N — количество чисел, после следуют N действительных чисел.

3
2
-12
12.1234
-12.000
12.123
IDE

U★: Таблица степеней — 1

На вход даётся число N. Необходимо вывести таблицу квадратов и кубов. Числа в таблице должны быть выровнены по правому краю. Ширина каждого столбца — 10 символов.
3
|         0|         0|         0|
|         1|         1|         1|
|         2|         4|         8|
|         3|         9|        27|
IDE

V★: Таблица степеней — 2

На вход даётся число N. Необходимо вывести таблицу квадратов и кубов. Числа в таблице должны быть выровнены по правому краю. Ширина каждого столбца должна быть минимальной, но так, чтобы все числа поместились.
5
|0| 0|  0|
|1| 1|  1|
|2| 4|  8|
|3| 9| 27|
|4|16| 64|
|5|25|125|
IDE

W★★: Таблица степеней — 3

На вход даётся числа d и N. Необходимо вывести таблицу степеней от 1 до d чисел от 0 до N. Числа в таблице должны быть выровнены по правому краю. Ширина каждого столбца должна быть минимальной, но так, чтобы все числа поместились.
4
5
|0| 0|  0|  0|
|1| 1|  1|  1|
|2| 4|  8| 16|
|3| 9| 27| 81|
|4|16| 64|256|
|5|25|125|625|
IDE

X★: Замена ребуса

Дан ребус — таблица 5 × 5, заполненная буквами так, что в каждой строке, столбце и на каждой диагонали все буквы различны. Нужно заменить его на другой ребус. Для этого каждая буква ребуса заменяется на другую соответствующую букву. Строка для замены букв даётся сразу после ребуса.

PS. Эта задача на maketrans и translate.

тилшу
лшути
утилш
илшут
шутил
шутил->чулан
ланчу
нчула
уланч
анчул
чулан
IDE