制霸 Python f-string 各種格式使用方法

Last updated on  Apr 9, 2024  in  Python 程式設計 - 初階  by  Amo Chen  ‐ 5 min read

開發程式時,字串的輸出經常會需要做一些格式(format),例如數字加上千分位符號、百分比,又或者需要置左、置中、置右對齊等等,這些需求 Python 也都有照顧到,本文將介紹 Python 如何做字串的格式化以及各種範例,讓大家都能夠輕鬆完成字串的格式化!

本文環境

  • Python 3

f-string

Python 3.6 之後支援 1 個強大的功能,被稱為 f-string ( f 代表 fast ),可以讓開發者直接在字串中嵌入變數,舉 s = f'Hello {name}' 為例, 假設變數 name 的值為 World 時,Python 會自動將變數 name 放到字串 s 之中,最後變成 Hello World :

name = 'World'
s = f'Hello {name}'
print(s)

p.s. f-string 一定要用 f 作為字串的前綴(prefix)

p.s. 上述範例中的 {name} 就是告訴 Python 這邊要引用變數 name ,變數一定要用大括號包起來

設定字串長度

設定字串長度是相當常見的需求,例如,我們希望某個變數至少 20 個字元長度時,下列的 {name:20} 代表變數 name 至少需要 20 個字元長度,如未滿 20 個字元長度則以空白填滿:

name = 'Jon'
s = f'^ {name:20} $'
print(s)

上述範例執行結果如下,可以看到 Jon 後面有多個空白:

^ Jon                  $

p.s. 要設定 1 個變數的輸出格式,就是在變數後方的冒號(:)加入設定

置右對齊 (right align)

通常數字我們會希望置右對齊,以方便比較數字大小,在 Python 中可以用 :>長度 達到需求,下列的 {num:>20} 就代表變數 num 至少 20 個字元長度,並置右對齊:

num = 1_000_000
s = f'{num:>20}'
print(s)

上述範例執行結果如下,可以看到數字完美置右,我們也不需要多寫幾行程式:

             1000000

置左對齊 (left align)

相反地,置左對齊則是將前述範例的 > 符號改為 < 符號即可,相當直覺:

num = 1_000_000
s = f'{num:<20}'
print(s)

上述範例執行結果如下,可以看到數字完美置左:

1000000

置中對齊 (center align)

除了置左、置右對齊之外, Python 也有提供置中對齊的功能,只要將角括號(<>) 改為 ^ 就可置中對齊,

num = 1_000_000
s = f'^ {num:^20} $'
print(s)

上述範例執行結果如下,可以看到數字被置中:

^       1000000        $

向左填充 (filling left)

置中、置左、置右對齊預設使用空白(space),進行填充(padding),如果想要將空白換成別的符號/字元,可以在 < , > , ^ 符號左邊加上符號,舉排隊序號為例,我們經常在左邊加上 0 ,例如 001, 002, 003 等,就可以用向左填充的功能,例如下列範例中的 {n:0>3} 代表數字 n 需至少 3 個字元長度,並且置右對齊,若不足 3 個字元長度則以 0 進行填充:

n = 1
s = f'{n:0>3}'
print(s)

上述範例執行結果如下,可以看到 Python 將空白改為以 0 進行填充:

001

向右填充 (filling right)

學會向左填充之後,向右填充也是將 > 符號改為相反的 < 即可,下列以 * 符號向右填充字串 Hello

h = 'Hello'
s = f'{h:*<12}'
print(s)

上述範例執行結果如下:

Hello*******

向左向右填充 (filling left & right)

如果將角括號改為 ^ 符號,就可以變為向左向右填充:

h = 'Hello'
s = f'{h:*^12}'
print(s)

上述範例執行結果如下:

***Hello****

數字千分位符號

產生數字相關報表時,數字加上千分位符號是十分常見的需求,在 Python 中只要加上逗號即可加上千分位符號,例如下列範例中的 {num:,} :

num = 1_000_000
s = f'{num:,}'
print(s)

上述範例執行結果如下:

1,000,000

如果你想讓數字用 Python 支援的語法,用底線(_)代表千分位符號的話,只要將逗號換成 _ 即可:

num = 1000000
s = f'{num:_}'
print(s)

上述範例執行結果如下:

1_000_000

百分比符號

Python 也支援在數字後方加上百分比(percentage)符號,只要是介於 -1 到 1 之間的浮點數,只要在冒號後方加上 % 符號,Python 就會自動轉為百分比,如下列範例中的 {a:%} ,變數 a 的值為 0.5555, Python 會幫忙轉為 55.550000% 顯示,是否十分方便呢?

a = 0.5555
s = f'{a:%}'
print(s)

上述範例執行結果如下:

55.550000%

如果覺得顯示太多位小數點後的數字的話,可以改為 .<小數點後位數>% ,就可以控制顯示的位數,例如下列範例:

a = 0.5555
s = f'{a:.2%}'
print(s)

上述範例執行結果如下,可以看到數字只顯示到小數點後 2 位:

55.55%

浮點數精度

如果要顯示的數字是浮點數,可以用 :f 表達這是浮點數,例如:

a = 0.123456789
s = f'{a:f}'
print(s)

上述範例執行結果如下,可以看到 :f 預設顯示到小數點(decimal point)後 6 位,而且會幫忙做 4 捨 5 入:

0.123457

與百分比符號設定小數點後的方法類似,只要改為 .<小數點後位數>f 就能夠控制要顯示小數點後幾位數字,例如 {a:.3f} 代表顯示到小數點後 3 位即可:

a = 0.123456789
s = f'{a:.3f}'
print(s)

上述範例執行結果如下:

0.123

科學符號 E

除了浮點數之外, Python 也有科學符號 E 的顯示方式,其代表符號為 :e:E ,這 2 者僅差在以小寫 e 或大寫 e 顯示科學符號而已:

a = 0.001
s = f'{a:e}'
print(s)

上述範例執行結果如下:

1.000000e-03

下列範例為顯示大寫 E 的科學符號:

a = 0.001
s = f'{a:E}'
print(s)

上述範例執行結果如下:

1.000000E-03

限定數字

除了 :f, :e 之外, Python 也提供 :d 的格式符號,代表此處僅可填入整數:

a = 123
s = f'{a:d}'
print(s)

上述範例執行結果如下:

123

如果將變數 a 改為整數以外的值,將會導致錯誤發生,例如改為字串時:

a = 'h'
s = f'{a:d}'
print(s)

因為變數 a 的值是字串,所以可以看到 ValueError 的錯誤被拋出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'd' for object of type 'str'

二進位/二進制

二進制的表示法對 Python 也是一盤小菜,只要使用 :b 即可輕鬆將數轉為二進制:

a = 4
s = f'{a:b}'
print(s)

上述範例執行結果如下,可以看到 4 被轉為 100 表示:

100

如果你想以 8 bit 進行表示,可以搭配向左填充的技巧使用:

a = 4
s = f'{a:0>8b}'
print(s)

上述範例執行結果如下,可以看到左邊的其他 bit 都以 0 進行填充:

00000100

16 進位/16進制

有二進制的表示方式,當然也會有 16 進制的表示方式,其表示方法為 :x ,舉常用的 RGB 色碼 0 ~ 255 的表示方式為例,如果要將 0 到 255 轉為 16 進制,就可以用 :x 幫忙轉換,完全不需要自己額外寫程式計算:

# RGB (Red, Green, Blue)
r = g = b = 255
s = f'#{r:x}{g:x}{b:x}'
print(s)

上述範例執行結果如下:

#ffffff

__str____repr__

Python 物件天生支援 __str____repr__ 2 種字串輸出方法,使用 f-string 也能彈性選擇要用哪種字串輸出方法,有別於冒號的用法,選擇 __str____repr__ 輸出的方法是使用 !s!r!s 代表選擇 __str__ 輸出, !r 代表選擇 __repr__ 輸出。

下列類別 S 定義 __str____repr__ 2 種字串輸出方法:

class S(object):
    def __str__(self):
        return '__str__'
    def __repr__(self):
        return '__repr__'

使用 !r 的範例如下:

o = S()
print(f'{o!r}')
__repr__

使用 !s 的範例如下:

o = S()
print(f'{o!s}')
__str__

方便 debugging 的 self-documenting expressions

Python 3.8 之後支援方便的 f-string 格式:

f"{變數名稱=}"

上述格式在列印之後會變成:

變數名稱=變數值

是對於除錯相當方便的用法!

範例如下:

code = "a"
print(f'{code=}')

執行結果如下:

code='a'

詳見 f-strings support = for self-documenting expressions and debugging

總結

雖然不多文章提到 Python 所提供的字串格式功能,但這功能其實是相當實用的,可以有效節省開發的成本,避免我們總是花時間在寫設定字串的輸出格式的功能,相當建議初學者能夠至少知道 Python 有內建這樣的功能可以幫助大家!

以上! Happy Coding!

References

PEP 498 – Literal String Interpolation

string — Common string operations

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!