- Часть I. Вводное руководство
- Глава 2. Использование интерпретатора
- 2.2. Интерпретатор и его среда
- 7.1. Форматированный вывод
7.1. Форматированный вывод
До сих пор мы использовали два способа вывода: вывод значений выражений в интерактивном режиме и с помощью инструкции print (третий способ — метод объектов-файлов write()).
Часто возникает желание иметь больший контроль над форматированием вывода, чем просто выводить значения, разделённые пробелом. Конечно, Вы можете сами обрабатывать строки: с помощью операций среза и объединения можно создать любое расположение, какое только Вы сможете представить. Строки имеют методы, позволяющие дополнять их пробелами до необходимой ширины колонки1. Другой путь — использовать оператор % со строкой в качестве левого аргумента. Оператор % интерпретирует строку справа как строку формата в стиле функции sprintf() в C, которую нужно применить к правому аргументу, и возвращает строку с результатом форматирования.
Безусловно, остаётся еще один вопрос: как получить строковое представление для значений различного типа? К счастью, Python предоставляет возможность преобразовывать значение любого типа в строку: с помощью функции str(). Фактически язык предоставляет две функции для получения строкового представления — repr() (тот же эффект можно получить просто заключив выражение в обратные кавычки: `expr`) и str(). Первый способ, например, используется интерпретатором для вывода значений выражений в интерактивном режиме, второй — для вывода аргументов инструкцией print. Функция str() по возможности возвращает представление, наиболее пригодное для вывода, а функция repr() — для ввода выражения в интерактивном режиме. Приведём несколько примеров:
>>> x = 10 * 3.14
Число 31.4 не может быть точно представлено в двоичном виде, поэтому:
>>> x
31.400000000000002
Однако функция str() выведет число с разумной точностью:
>>> y = 200*200
>>> s = 'Значение x равно ' + str(x) + \
... ', значение y равно ' + str(y) + '...'
>>> print s
Значение x равно 31.4, значение y равно 40000...
Длинные целые числа записываются в языке Python с суффиксом 'L'. Начиная с версии 1.6, функция str() его не выводит:
>>> repr(1000L)
'1000L'
>>> str(1000L)
'1000'
Строковое представление можно получить и для других типов:
>>> p = [x, y]
>>> ps = repr(p)
>>> ps
'[31.400000000000002, 40000]'
>>> `x, y, ('spam', 'eggs')`
"(31.400000000000002, 40000, ('spam', 'eggs'))"
Функция repr() (или ``) добавляет кавычки и записывает спецсимволы с помощью управляющих последовательностей:
>>> hello = 'hello, world\n'
>>> print hello
hello, world
>>> hellos = `hello`
>>> print hellos
'hello, world\n'
Выведем таблицу квадратов и кубов двумя описанными способами:
>>> for x in range(1, 11):
... print str(x).rjust(2), str(x*x).rjust(3),
... # Обратим внимание на завершающую запятую
... print str(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 729
10 100 1000
>>> for x in range(1,11):
... print '%2d %3d %4d' % (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 729
10 100 1000
(Обратите внимание на то, что один пробел между колонками был добавлен инструкцией print.)
Этот пример демонстрирует использование метода строк rjust(), который выравнивает строку вправо в поле заданной ширины, дополняя её слева пробелами. Аналогично действуют методы ljust() и center(). Они не выводят ничего — просто возвращают новую строку. Если исходная строка слишком длинная, она не обрезается, а возвращается в неизменном виде: обычно лучше внести беспорядок в расположение колонок, чем вывести неверное значение. (Если Вы действительно хотите её обрезать, воспользуйтесь операцией среза: 's.ljust(n)[0:n]'.)
Также может быть полезна функция zfill(), определённая в модуле string, которая дополняет слева нулями строку с числом, корректно обрабатывая знаки плюс и минус:
>>> import string
>>> string.zfill('12', 5)
'00012'
>>> string.zfill('-3.14', 7)
'-003.14'
>>> string.zfill('3.14159265359', 5)
'3.14159265359'
Использование оператора % выглядит примерно так:
>>> import math
>>> print 'Значение PI приблежённо равно %5.3f.' % \
... math.pi
Значение PI приблежённо равно 3.142.
Если в строке нужно вывести несколько значений, в качестве правого операнда используется кортеж:
>>> table = {'Sjoerd': 4127, 'Jack' : 4098, 'Dcab' : 7678}
>>> for name, phone in table.items():
... print '%-10s ==> %10d' % (name, phone)
...
Dcab ==> 7678
Jack ==> 4098
Sjoerd ==> 4127
Большинство форматов работают точно так же, как и в C. Однако, если типы аргументов не соответствуют формату, интерпретатор приводит их к необходимому типу (например, выражение любого типа может быть преобразовано в строку с помощью встроенной функции str()) или, если это невозможно, генерирует исключение2. Вы можете использовать * для того, чтобы передать отдельным параметром ширину поля или точность.
Заметим, что если правый аргумент кортеж, он всегда считается списком аргументов:
>>> def f(x):
... print 'Функции передано значение "%s"' % x
...
>>> f(1)
Функции передано значение "1"
>>> f([1, 2])
Функции передано значение "[1, 2]"
>>> # интерпретируется не так, как вы ожидали
... f((1,))
Функции передано значение "1"
>>> # ошибка
... f((1, 2))
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in f
TypeError: not all arguments converted during string formatting
В данном случае надёжнее будет использовать в качестве правого операнда кортеж, состоящий из одного элемента:
>>> def f(x):
... print 'Функции передано значение "%s"' % (x,)
...
>>> # Теперь всё правильно
... f((1,))
Функции передано значение "(1,)"
>>> f((1, 2))
Функции передано значение "(1, 2)"
>>> f(1)
Функции передано значение "1"
>>> f([1,2])
Функции передано значение "[1, 2]"
В случае длинных строк формата, Вы можете захотеть ссылаться на переменные по имени вместо их положения. Это можно сделать, используя расширенную запись в виде %(name)format, например:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
Такая запись особенно полезна в комбинации со встроенной функцией vars(), которая возвращает словарь с переменными в текущей области видимости.
Более подробно операции над строками описаны в разделе 11.2.1.
- Эти методы строк появились в версии 1.6 языка Python. В предыдущих версия они доступны в виде функций, определенных в модуле string.
- Из этого правила есть исключение: интерпретатор не будет преобразовывать строку к числовому типу.