目錄 | 上一節 (2.2 容器) | 下一節 (2.4 序列)html
雖然本節稍微有點離題,可是當處理數據時,一般想要生成結構化的輸出(如表格)。示例: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-strings
:git
>>> 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()
方法能夠將格式化應用於參數或者關鍵字參數: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。
也可使用格式化操做符 %
:
>>> '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' >>>
打印數字常見的一個問題就是指定數字的小數位數。其中的一種解決方法就是使用 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.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.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()
的輸出,並打印如打印如上圖所示的格式化的表。
假定有一個像下面這樣的標題名稱元組:
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
如何修改代碼使得價格包括貨幣符號($),而且像下面這樣輸出:
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