Особенности форматирования вывода. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Особенности форматирования вывода.



До сих пор мы сталкивались с двумя способами вывода значений: операторы выражений и функция print(). (Третий способ - это использование метода write() файловых объектов; на файл стандартного вывода можно ссылаться как на sys.stdout.)

Чаще вам захочется больше контроля над форматированием вашего вывода, чем простое печатание разделенных пробелом значений. Есть два способа форматировать ваш вывод; первый способ - чтобы все строки обрабатывали сами себя; используя нарезание строк и операторы конкатенации, вы можете создать любую разметку, какое можете представить. Строковый тип имеет несколько методов, которые выполняют полезные операции для обивки строк данной шириной столбца. Второй способ - использовать formatted string или метод str.format().

Модуль string содержит класс Template, который предлагает еще один способ подстановки значений в строки.

Конечно остается один вопрос: как вы конвертируете значения в строки? К счастью Python имеет способы конвертации любого значения в строку: передайте его функции repr() или str().

Функция str() подразумевалась для возврата представлений значений, которые достаточно читабельны, тогда как repr() подразумевалась для генерации представлений, которые могут быть прочитаны интерпретатором (или приведут к SyntaxError, если не окажется эквивалентного синтаксиса). Для объектов, которые не имеют конкретного представления для восприятия человеком, str() вернет то же самое значение, что и repr(). Множество значений, такие как числа или структуры как списки и словари, имеют одинаковое представление, используя любую функцию. Строки, в частности, имеют два отдельных представления.

Несколько примеров:

>>> s = 'Hello, world.'>>> str(s)'Hello, world.'>>> repr(s)"'Hello, world.'">>> str(1/7)'0.14285714285714285'>>> x = 10 * 3.25>>> y = 200 * 200>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'>>> print (s)The value of x is 32.5, and y is 40000...>>> # repr() строки добавляет строковые кавычки и бэкслэши:... hello = 'hello, world \n '>>> hellos = repr(hello)>>> print (hellos)'hello, world \n '>>> # Аргумент для repr() может быть любым объектом Python:... repr((x, y, ('spam', 'eggs')))"(32.5, 40000, ('spam', 'eggs'))"

Вот два способа вывести таблицу квадратов и кубов:

>>> for x in range(1, 11):... print (repr(x).rjust(2), repr(x*x).rjust(3), end=' ')... # Обратите внимание на использование 'end' в предыдущей строке... print (repr(x*x*x).rjust(4))... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6  36 216 7 49 343 8 64 512 9 81 72910 100 1000 >>> for x in range(1, 11):... print ('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 72910 100 1000

(Заметьте, что в первом примере один пробел между каждым столбцом был добавлен с помощью print(): он всегда добавляет пробелы между своими аргументами.)

Этот пример демонстрирует метод строковых объектов str.rjust(), который выравнивает строку по правому краю в поле заданной ширины, заполняя ее пробелами слева. Есть схожие методы str.ljust() и str.center(). Они ничего не выводят, а просто возвращают новую строку. Если вводимая строка слишком длинная, они не урезают ее, а возвращают без изменений; это приведет в беспорядок вашу планировку столбцов, но это обычно лучше, чем альтернатива, которая выдала бы ложное значение. (Если вы действительно хотите усечь, вы всегда можете добавить оператор среза, как в x.ljust(n)[:n].)

Существует другой метод, str.zfill(), который заполняет нулями слева числовую строку. Он понимает знаки плюс и минус:

>>> '12'. zfill(5) '00012' >>> '-3.14'. zfill(7) '-003.14' >>> '3.14159265359'. zfill(5) '3.14159265359'

Основное использование метода str.format() выглядит вот так:

>>> print('We are the {} who say "{}!"'. format('knights', 'Ni'))We are the knights who say "Ni!

Скобки и символы внутри них (называемые полями форматирования) заменяются объектами, переданными методу str.format(). Число в скобках может быть использовано как ссылка на позицию объекта, переданного методу str.format().

>>> print('{0} and {1}'. format('spam', 'eggs'))spam and eggs>>> print('{1} and {0}'. format('spam', 'eggs'))eggs and spam

Если в методе используются аргументы-ключевые слова, их значения определяются путем использования имени аргумента.

>>> print('This {food} is {adjective}.'. format(...       food= 'spam', adjective= 'absolutely horrible'))This spam is absolutely horrible.

Позиционные и keyword (ключевые слова - прим. пер.) аргументы могут быть произвольно скомбинированы:

>>> print('The story of {0}, {1}, and {other}.'. format('Bill', 'Manfred',                                                  other= 'Georg'))The story of Bill, Manfred, and Georg.

'!a' (применяет ascii()), '!s' (применяет str()) и '!r' (применяет repr()) могут быть использованы для конвертирования значение перед тем, как оно будет отформатировано:

>>> contents = 'eels' >>> print('My hovercraft is full of {}.'. format(contents))My hovercraft is full of eels.>>> print('My hovercraft is full of {!r}.'. format(contents))My hovercraft is full of 'eels'.

Необязательное ':' и спецификатор формата могут следовать за именем поля. Это позволяет получить больший контроль над форматированием значения. Следующий пример округляет Pi до трех знаков после точки.

>>> import math>>> print('The value of PI is approximately {0:.3f}.'. format(math.pi))The value of PI is approximately 3.142.

Передача целого числа после ':' создаст поле, минимальная ширина которого будет соответствовать этому числу. Это полезно для создания таблицы.

>>> table = { 'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}>>> for name, phone in table.items():...     print('{0:10} ==> {1:10d}'. format(name, phone))...Jack  ==>  4098Dcab  ==>  7678Sjoerd ==>  4127

Если у вас действительно длинная строка, которую вы не хотите разделять, будет замечательно, если вы упомяните переменные, которые форматируются по имени, вместо позиций. Это может быть сделано простой передачей словаря и использованием квадратных скобок '[]' для доступа к ключам

>>> table = { 'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '...        'Dcab: {0[Dcab]:d}'. format(table))Jack: 4098; Sjoerd: 4127; Dcab: 8637678

Это может быть также сделано передачей таблицы в качестве аргумента-ключевого слова с использованием нотации '**'.

>>> table = { 'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'. format(**table))Jack: 4098; Sjoerd: 4127; Dcab: 8637678

Это особенно полезно в сочетании с функцией vars(), которая возвращает словарь, включающий все локальные переменные.



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 42; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.128.170.27 (0.006 с.)