содержание | Предыдущий раздел (2.2 Контейнеры) | Следующий раздел (2.4 Последовательность)
2.3 Форматирование
Хотя этот раздел немного не по теме, при работе с данными часто требуется генерировать структурированный вывод (например, таблицу). Пример:
Name Shares Price
---------- ---------- -----------
AA 100 32.20
IBM 50 91.10
CAT 150 83.44
MSFT 200 51.23
GE 95 40.37
MSFT 50 65.10
IBM 100 70.44
форматирование строки
В Python 3.6+ одним из способов форматирования строк является использованиеf-strings
:
>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{name:>10s} {shares:>10d} {price:>10.2f}'
' IBM 100 91.10'
>>>
{expression:format}
часть будет заменена.
f-strings
обычно иprint()
функционируют вместе:
print(f'{name:>10s} {shares:>10d} {price:>10.2f}')
код формата
код формата (в{}
Внутри:
после) с языком Cprintf()
функция аналогична. Коды общего формата включают:
d Decimal integer
b Binary integer
x Hexadecimal integer
f Float as [-]m.dddddd
e Float as [-]m.dddddde+-xx
g Float, but selective use of E notation
s String
c Character (from integer)
Общие модификаторы регулируют ширину поля и точность чисел. Вот часть этого:
:>10d Integer right aligned in 10-character field
:<10d Integer left aligned in 10-character field
:^10d Integer centered in 10-character field
:0.2f Float with 2 digit precision
форматирование словаря
можно использовать строкуformat_map()
метод применяет форматирование строки к словарю значений:
>>> s = {
'name': 'IBM',
'shares': 100,
'price': 91.1
}
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format_map(s)
' IBM 100 91.10'
>>>
Несмотря на то чтоformat_map()
иf-strings
Используйте тот же код формата, но получите значение из предоставленного словаря.
метод формат()
существует одинformat()
Методы могут применять форматирование к параметрам или аргументам ключевого слова:
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format(name='IBM', shares=100, price=91.1)
' IBM 100 91.10'
>>> '{:10s} {:10d} {:10.2f}'.format('IBM', 100, 91.1)
' IBM 100 91.10'
>>>
честно говоря,format()
Метод немного многословен, я предпочитаю использовать f-строки.
Форматирование в стиле C
Вы также можете использовать операторы форматирования%
:
>>> 'The value is %d' % 3
'The value is 3'
>>> '%5d %-5d %10d' % (3,4,5)
' 3 4 5'
>>> '%0.2f' % (3.1415926,)
'3.14'
Для этого требуется, чтобы правая сторона была отдельным элементом или кортежем, а код формата также имитировался языком C.printf()
функциональный.
Примечание. Это единственный метод форматирования, доступный для байтовых строк.
>>> b'%s has %n messages' % (b'Dave', 37)
b'Dave has 37 messages'
>>>
Упражнение
Упражнение 2.8. Как форматировать числа
Распространенной проблемой при печати чисел является указание количества знаков после запятой. Одно из решений — использовать f-строки. Пожалуйста, попробуйте следующие примеры:
>>> value = 42863.1
>>> print(value)
42863.1
>>> print(f'{value:0.4f}')
42863.1000
>>> print(f'{value:>16.2f}')
42863.10
>>> print(f'{value:<16.2f}')
42863.10
>>> print(f'{value:*>16,.2f}')
*******42,863.10
>>>
Полная документация по кодам формата, используемым f-строками, находится по адресуздесьможно найти. Иногда также используются строковые операторы.%
Выполняется форматирование.
>>> print('%0.4f' % value)
42863.1000
>>> print('%16.2f' % value)
42863.10
>>>
И оператор%
Документацию по различным используемым кодам форматов можно найти по адресуздесьоказаться. Хотя это обычноprint()
работают вместе, но форматирование строк не имеет ничего общего с печатью. Чтобы сохранить отформатированную строку, присвойте ее переменной.
>>> f = '%0.4f' % value
>>> f
'42863.1000'
>>>
Упражнение 2.9. Сбор данных
В упражнении 2.7 вы написали программу для расчета прибыли и убытков от инвестиций в акции.report.py
. В этом упражнении вы измените программу для создания следующей таблицы:
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84
В этой таблице «Цена» — это текущая цена акции, а «Изменение» — разница между текущей ценой акции и первоначальной ценой покупки.
Для того, чтобы сгенерировать приведенную выше таблицу, вам сначала нужно собрать все данные, представленные в таблице. написатьmake_report()
Функция, которая принимает на вход список акций и словарь цен и возвращает список кортежей, содержащих все строки в приведенной выше таблице.
Пучокmake_report()
функция добавлена вreport.py
в файле. Если вы выполняете функцию в интерактивном режиме, вы должны действовать следующим образом:
>>> portfolio = read_portfolio('Data/portfolio.csv')
>>> prices = read_prices('Data/prices.csv')
>>> report = make_report(portfolio, prices)
>>> for r in report:
print(r)
('AA', 100, 9.22, -22.980000000000004)
('IBM', 50, 106.28, 15.180000000000007)
('CAT', 150, 35.46, -47.98)
('MSFT', 200, 20.89, -30.339999999999996)
('GE', 95, 13.48, -26.889999999999997)
...
>>>
Упражнение 2.10. Печать форматированной таблицы
Повторите цикл for из упражнения 2.9, но измените оператор печати для форматирования кортежа.
>>> for r in report:
print('%10s %10d %10.2f %10.2f' % r)
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
...
>>>
Значения также можно расширить с помощью f-строк. Например:
>>> for name, shares, price, change in report:
print(f'{name:>10s} {shares:>10d} {price:>10.2f} {change:>10.2f}')
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
...
>>>
Добавьте приведенное выше утверждение вreport.py
программа, пусть программа получитmake_report()
и распечатайте отформатированную таблицу, как показано выше.
Упражнение 2.11. Добавьте заголовок
Предположим, что имеется кортеж имен заголовков, подобный следующему:
headers = ('Name', 'Shares', 'Price', 'Change')
Добавьте приведенный выше код кортежа заголовка в программу и создайте строку, в которой каждый заголовок выровнен по правому краю и имеет ширину 10, а каждое поле разделено одним пробелом.
' Name Shares Price Change'
Напишите код, который создает строку с разделителями между заголовком и данными. Строка с разделителями — это строка символов подчеркивания ("-") под каждым именем поля. Например:
'---------- ---------- ---------- -----------'
По завершении программа должна сгенерировать таблицу, показанную в верхней части этого раздела.
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84
Упражнение 2.12: задание на форматирование
Как я могу изменить код, чтобы цена включала знак валюты ($) и выводилась следующим образом:
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 $9.22 -22.98
IBM 50 $106.28 15.18
CAT 150 $35.46 -47.98
MSFT 200 $20.89 -30.34
GE 95 $13.48 -26.89
MSFT 50 $20.89 -44.21
IBM 100 $106.28 35.84
содержание | Предыдущий раздел (2.2 Контейнеры) | Следующий раздел (2.4 Последовательность)Примечание. Полный перевод см.GitHub.com/co Статья 3 — /PRA…