Старый способ — строковый оператор форматирования
Оператор % по отношению к строкам выполняет операцию форматирования и вставки таким образом, что объект, стоящий справа от него, встраивается согласно определенным правилам в строку слева от него:
string % value
Такой способ форматирования считается старым видимо потому, что заимствован из функции printf() языка C, а в Python кроме него появились более продвинутые средства форматирования вывода. Однако в ряде случаев использование оператора % бывает удобнее, чем использование строкового метода format().
Следует отметить, что форматируются строки, а не вывод. На вывод передается уже сформированная строка.
Как вывести вещественное число с необходимой точностью
Оператор деления /
возвращает вещественное число. Если количество знаков бесконечно, то Python выведет его в таком виде:
>>> 4 / 3
1.3333333333333333
Обычно требуется лишь определенное количество знаков. Для этого в строку записывают комбинацию символов, начинающуюся с %. Число после точки обозначает количество знаков после запятой. Символ f обозначает вещественный тип данных float.
>>> "%.4f" % (4/3)
'1.3333'
Ставить скобки обязательно, иначе операция % выполняется раньше /:
>>> "%.4f" % 4/3
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
"%.4f" % 4/3
TypeError: unsupported operand type(s) for /: 'str' and 'int'
Оператор форматирования строк выполняет округление, а не урезание:
>>> "%.4f" % (1.33335)
'1.3334'
>>> "%.4f" % (1.33334)
'1.3333'
С функцией print():
>>> print("Number %.4f" % (1.33334))
Number 1.3333
>>> print("%.4f, %.2f" % (1.33334, 153*0.43))
1.3333, 65.79
>>> print("%f, %f" % (1.33334, 153*0.43))
1.333340, 65.790000
>>> 153*0.43
65.78999999999999
Вывод символа по номеру
>>> "%c" % 121
'y'
>>> "%c" % 189
'½'
>>> "%c" % 255
'ÿ'
>>> "%c" % 999
'ϧ'
>>> "%c" % 32400
'纐'
Если вместо символа ‘c' использовать ‘d', будет вставлено само целое число.
Вставка в строку значений через ключ словаря
>>> '%(1)s, %(2).3f' % {'1': 'AB', '2': 2.33333}
'AB, 2.333'
Вывод данных в поля заданной ширины
Бывает данные на экран надо вывести не через один пробел, а в виде таблицы. Другими словами, в полях определенной ширина, где ширина измеряется в знакоместах.
Рассмотрим пример. Допустим надо вывести числа второй строки под числами первой. Если выполнить функцию print() так:
print(10, 235)
print(1000, 50)
результат будет таким:
10 235
1000 50
Чтобы привести вывод к табличному виду, необходимо задать ширину поля:
print("%5d%7d" % (10, 235))
print("%5d%7d" % (1000, 50))
Результат:
10 235
1000 50
Здесь в кавычках указаны форматы данных и ширина полей. После знака % за кавычками указаны данные, которые будут подставлены вместо каждого указанного формата. Если количество форматов не совпадает с количеством данных, возникнет ошибка.
Форматы данных могут быть: d — целое число, s — строка, f — вещественное число, c — символ.
По умолчанию данные выравниваются по правому краю поля. Чтобы выровнять их по левому, достаточно поставить знак минус перед числом, обозначающим ширину поля. Пример:
print("%-5d%7d" % (10, 235))
print("%-5d%7d" % (1000, 50))
Вывод:
10 235
1000 50
Новый способ форматирования — метод format()
Строковый метод format() возвращает отформатированную версию строки, заменяя идентификаторы в фигурных скобках. Идентификаторы могут быть позиционными, числовыми индексами, ключами словарей, именами переменных.
Аргументов в format() может быть больше, чем идентификаторов в строке. В таком случае оставшиеся игнорируются.
Идентификаторы могут быть либо индексами аргументов, либо ключами:
>>> "{}, {} and {}".format('one', 1, 'I')
'one, 1 and I'
>>> "{1}, {2} and {0}".format('one', 1, 'I')
'1, I and one'
>>> nums = [3, 4, 5, 6, 2, 0]
>>> "{}{}{}".format(*nums)
'345'
>>> "{0}{2}{4}".format(*nums)
'352'
>>> u = {'name':'bob','age':35}
>>> '{name}-{age}'.format(**u)
'bob-35'
>>> '{name}'.format(**u)
'bob'
>>> '{name}-{age}'.format(name="pi",age=3.14)
'pi-3.14'
>>> '{0}-{age}'.format("sin",**u)
'sin-35'
Вывод атрибутов объекта:
>>> class house:
size = "big"
street = "main"
>>> h = house()
>>> '{0.size}, {0.street}'.format(h)
'big, main'
Можно задавать ширину поля и выравнивание:
>>> '{name:10}-{age:3}'.format(**u)
'bob - 35'
>>> '{name:>10}-{age:>3}'.format(**u)
' bob- 35'
>>> '{name:^10}-{age:^3}'.format(**u)
' bob -35 '
Вывод вещественных чисел:
>>> '{0}'.format(4/3)
'1.3333333333333333'
>>> '{0:f}'.format(4/3)
'1.333333'
>>> '{0:.2f}'.format(4/3)
'1.33'
>>> '{0:10.2f}'.format(4/3)
' 1.33'
>>> '{0:10e}'.format(4/3)
'1.333333e+00'
Выравнивание строк другими строковыми методами
>>> a = "Hello"
>>> a.center(10)
' Hello '
>>> a.rjust(10)
' Hello'
>>> a.ljust(10)
'Hello '
>>> a.ljust(10,'.')
'Hello.....'
>>> a.center(10,'.')
'..Hello...'
>>> "%s" % (a.center(19))
' Hello '