Форматированный вывод, форматирование строк

Старый способ - строковый оператор форматирования

Оператор % по отношению к строкам выполняет операцию форматирования и вставки таким образом, что объект, стоящий справа от него, встраивается согласно определенным правилам в строку слева от него:

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'

Новый способ форматирования - метод 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       '