翻譯:《實用的Python編程》02_03_Formatting

目錄 | 上一節 (2.2 容器) | 下一節 (2.4 序列)html

2.3 格式化

雖然本節稍微有點離題,可是當處理數據時,一般想要生成結構化的輸出(如表格)。示例:python

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-stringsgit

>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{name:>10s} {shares:>10d} {price:>10.2f}'
'       IBM        100      91.10'
>>>

{expression:format} 部分會被取代。github

f-strings 一般和 print() 函數一塊兒使用:express

print(f'{name:>10s} {shares:>10d} {price:>10.2f}')

格式碼

格式碼(在 {}: 以後)與 C 語言的 printf() 函數相似。常見格式碼包括:函數

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() 方法將字符串格式化應用於值的字典:code

>>> 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 使用相同的格式碼,可是是從提供的字典中獲取值。orm

format()方法

有一個 format() 方法能夠將格式化應用於參數或者關鍵字參數:htm

>>> '{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-strings。

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-strings。請嘗試如下示例:

>>> 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-strings 使用的格式碼的完整文檔在 這裏 能夠找到。有時,也使用字符串操做符 % 執行格式化。

>>> 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

在此表格中,"Price" 是當前股價,"Change" 是當前股價與原始購買股價的差。

爲了生成上述表格,首先須要收集表中展現的全部數據。編寫 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:打印格式化的表格

重作練習 2.9 中的 for 循環,可是請更改打印語句以格式化元祖。

>>> 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-strings 擴展值。例如:

>>> 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 序列)

注:完整翻譯見 https://github.com/codists/practical-python-zh

相關文章
相關標籤/搜索