Форматированный вывод, форматирование строк
Старый способ - строковый оператор форматирования
Оператор % по отношению к строкам выполняет операцию форматирования и вставки таким образом, что объект, стоящий справа от него, встраивается согласно определенным правилам в строку слева от него:
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 '