Python格式化字串字面值 | 被官方文件稱之為『漂亮』的輸出格式

語言: CN / TW / HK

Python格式化字串字面值 | 被官方文件稱之為『漂亮』的輸出格式

本文參考輸入輸出 — Python 3.7.10 文件。首先宣告咱的實驗環境。

❯ 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
拒絕原假設

我們將介紹一種格式化方法,無論是書寫還是易讀,都比上述方法要優雅。

並且,我們將解決字串拼接不能自動解決的小數位科學計數法等問題。

格式化字串字面值

官方文件:要使用格式化字串字面值,請在字串的開始引號或三引號之前加上一個 fF 。在此字串中,你可以在 {} 字元之間寫可以引用的變數或字面值的 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)」。

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)。咱們這裡自己造個場景:打印表格。

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格式化函式也是不錯的中文資料。

以後隨用隨查,在搜尋引擎中輸入關鍵字python + 格式化輸出即可。

我是小拍,歡迎加我微信 PiperLHJ 轉載交流。

「其他文章」