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