Перевод: "Практическое программирование на Python" 02_03_Formatting

Python

содержание | Предыдущий раздел (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…