Python 格式化字符串字面值
本文轉載自微信公眾號「Piper蛋窩」,作者Piper蛋。轉載本文請聯系Piper蛋窩公眾號。
本文參考輸入輸出 — Python 3.7.10 文檔[1]。首先聲明咱的實驗環境。
- ❯ python --version
- Python 3.7.0
引例:場景帶來的需求
我們要在控制臺上給用戶反饋計算結果(比如AOE值為 0.82),于是就要寫 print 邏輯。描述計算結果的語句是死的(AOE值為),但數字是活的(0.82)。我們希望把計算結果拼接到描述結構的語句上。新手可能會用字符串的拼接(字符串的「加法運算」+)。
- val_dict = {
- 'AOE': 0.8200001,
- 'wcb': 13423431,
- 'p': 0.0314
- }
- print("AOE值為 " + str(val_dict['AOE']) + " ,wcb值為 " + str(val_dict['wcb']))
- if val_dict['p'] < 0.05: print('拒絕原假設')
- else: print('接收原假設')
輸出:
- AOE值為 0.8200001 ,wcb值為 13423431
- 拒絕原假設
我們將介紹一種格式化方法,無論是書寫還是易讀,都比上述方法要優雅。
并且,我們將解決字符串拼接不能自動解決的小數位、科學計數法等問題。
格式化字符串字面值
官方文檔:要使用格式化字符串字面值,請在字符串的開始引號或三引號之前加上一個 f 或 F 。在此字符串中,你可以在 { 和 } 字符之間寫可以引用的變量或字面值的 Python 表達式。
有點費解,還是看實例最清晰。
咱們把上面的代碼改一下。
- print(f"AOE值為 {val_dict['AOE']} ,wcb值為 {val_dict['wcb']}")
- print(f"{'拒絕原假設' if val_dict['p'] < 0.05 else '接收原假設'}")
輸出:
- AOE值為 0.8200001 ,wcb值為 13423431
- 拒絕原假設
沒毛病,和之前的寫法效果一模一樣。但是咱們這回直接把「活的」變量『嵌入』到「死的」句子里面去了。
而且咱還把邏輯寫進了字符串,說明在 f"{}" 的 {} 大括號里面,放變量和表達式都行。
再把上面的例子變個形,來看看更多用法:比如在 {} 大括號里做簡單的運算,或者使用一些特殊格式化語法保留小數、轉化為科學計數法。
- print(f"AOE值為 {val_dict['AOE'] * 100}% ,wcb值為 {val_dict['wcb'] :E}")
- print(f"{'拒絕原假設' if val_dict['p'] < 0.05 else '接收原假設'}")
輸出:
- AOE值為 82.00001% ,wcb值為 1.342343E+07
- 拒絕原假設
注意到上面我們用了 {val_dict['wcb'] :E} 這樣的特殊語法,:E 表示把數字 val_dict['wcb'] 轉換為科學計數法。
類似:E,我們還有更多用法。在 Python 中,其名稱為格式規格迷你語言(format specification mini language)[2]。
我們可以直接應用 :.2% 來表示「讓數字變成百分數%,并且保留兩位小數(.2)」。
- print(f"AOE值為 {val_dict['AOE'] :.2%}% ,wcb值為 {val_dict['wcb'] :E}")
- print(f"{'拒絕原假設' if val_dict['p'] < 0.05 else '接收原假設'}")
輸出:
- AOE值為 82.00%% ,wcb值為 1.342343E+07
- 拒絕原假設
豈不是要比 {val_dict['AOE'] * 100}% 的寫法優雅很多。
更多示例
其他用法可以參考Python 的字符串格式示例(format examples)[3]。咱們這里自己造個場景:打印表格。
- table = {
- 'Tom': [31, 32.314, 31, .423],
- 'Jerry': [1, .41, 313, 123],
- 'Paul': [7, .4, 53, .45754]
- }
- def print_table(t):
- print('| name | attr | feat | gest | dest |')
- print('|--------|--------|--------|--------|--------|')
- for name, vals in table.items():
- print(f'|{name :_^8}|{vals[0] :^8}|{vals[1] :>6.2f} |{vals[2] :^8}|{vals[3] :>8.3f}|')
- print_table(table)
輸出:
- | name | attr | feat | gest | dest |
- |--------|--------|--------|--------|--------|
- |__Tom___| 31 | 32.31 | 31 | 0.423|
- |_Jerry__| 1 | 0.41 | 313 | 123.000|
- |__Paul__| 7 | 0.40 | 53 | 0.458|
如上:
- 我們的數據在 table 里存儲了數據
- 在 print_table 保存了打印數據的邏輯
- f{name :_^8} 中,^表示居中,8表示長度為 8,_表示填充_(默認填充空格)
- f{vals[1] :>6.2f} 中,>6表示長度為 6 且靠右,.2f表示作為小數,且保留 2 位
更多的內容除了參考官方文檔,菜鳥教程的 Python 格式化函數[4]也是不錯的中文資料。
以后隨用隨查,在搜索引擎中輸入關鍵字python + 格式化輸出即可。
參考資料
[1]輸入輸出 — Python 3.7.10 文檔: https://docs.python.org/zh-cn/3.7/tutorial/inputoutput.html
[2]格式規格迷你語言(format specification mini language): https://docs.python.org/zh-cn/3.7/library/string.html#format-specification-mini-language
[3]Python 的字符串格式示例(format examples): https://docs.python.org/zh-cn/3.7/library/string.html#formatexamples
[4]菜鳥教程的 Python 格式化函數: https://www.runoob.com/python/att-string-format.html