# Python 好用的 F 字串！

> 本文說明 Python F 字串的格式化用法。除了基本的變數安插，F 字串還能處理千位數逗點、小數位數控制與百分比轉換。此外，文章也介紹如何設定字串寬度與對齊方式，並涵蓋進位轉換、科學記號及日期格式化。透過這些內建工具，開發者能更有效率地處理終端機輸出與資料呈現，提升程式碼的可讀性與維護性。

Published: 2024-02-29
URL: https://kaochenlong.com/f-strings-in-python

---

Python 裡的 F 字串（F-String）不只是可以直接把變數塞到字串裡、看起來更好看、更好寫而已，它還有一些有趣的用法，像是我們常會遇到需要幫錢錢加上千位數字的逗點，在其它程式語言可能需要透過其它函數或是另外自己寫函數來處理，用 F 字串可以輕鬆做到這件事，例如：

&lt;!-- more --&gt;

```py
my_money = 1000000

print(f&quot;{my_money:,}&quot;)     # 印出 1,000,000
print(f&quot;{my_money:.2f}&quot;)   # 印出 1000000.00
print(f&quot;{my_money:,.2f}&quot;)  # 印出 1,000,000.00
```

在 F 字串裡的變數後面加上 `:` 可以幫我們做格式化，這裡的 `,` 就是在千位數字的地方加上逗點，`.2f` 是指可以讓原本的整數以小數點以下 2 位數的方式呈現，如果組合在一起 `,.2f` 就會變成整數部份加上千位數逗號，小數部份則呈現到小數點以下 2 位數。

有時候我們在做一些數學計算之後得到的結果想要用百分比的形式，你可能得先把它乘以 100 再後面加個 `%` 符號，像這樣：

```py
ratio = 0.315
print(f&quot;{ratio * 100}%&quot;) # 印出 31.5%
```

這沒什麼問題，在別的程式語言也差不多是這麼做，但 Python 的 F 字串可以更簡單幫我們做到這件事：

```py
ratio = 0.315
print(f&quot;{ratio:.1%}&quot;) # 印出 31.5%
```

`.1` 表示顯示到小數點以下第 1 位，後面的 `%` 就是直接幫我們換成百分比的形式，至於這樣寫有沒有比較簡單或直觀可能因人而異了，因為有些人少了乘以 100 可能會覺得哪裡怪怪的。

如果有需要的話，我們同樣也可以透過 `:` 來設定字串的「寬度」，例如：

```py
pi = 3.1415926

print(f&quot;|{pi:5}|&quot;)   # 印出 |3.1415926|
print(f&quot;|{pi:20}|&quot;)  # 印出 |            3.1415926|
```

我刻意在字串的兩邊加上 `|` 是為了讓大家看得更清楚一點，`:` 後面接的數字就是這個 `{}` 字串的寬度，如果字串本身的字數超過寬度（例如 `5`），字串還是會把設定的寬度給撐開，如果我設定寬度大一點，例如設定成 `20`，這樣會在字串的左邊補上空白，呈現出來的效果就會變成靠右對齊。

有靠右對齊，自然也有靠左對齊跟置中對齊，這時候可以在寬度的數字前面加上一個 `-` 符號，例如：

```py
pi = 3.1415926

print(f&quot;|{pi:&lt;20}|&quot;)  # 靠左對齊
print(f&quot;|{pi:&gt;20}|&quot;)  # 靠右對齊
print(f&quot;|{pi:^20}|&quot;)  # 置中對齊
```

印出來的結果會是：

```
|3.1415926           |
|           3.1415926|
|     3.1415926      |
```

以做網站來說，因為瀏覽器不太會理會 HTML 裡多餘的空白字元，所以這種格式化對齊大概沒什麼機會派上用場，但如果是用在做一些資料統計或分析的小程式，並打算在終端機畫面呈現或是列印報表的時候，這種對齊就挺方便的了，例如：

```py
print(f&quot;1. {&#39;為你自己學 Python&#39;:&lt;20} {&#39;NTD 120&#39;}&quot;)
print(f&quot;2. {&#39;為你自己學 Git&#39;:&lt;20} {&#39;NTD 200&#39;}&quot;)
print(f&quot;3. {&#39;為你自己學 Ruby&#39;:&lt;20} {&#39;NTD 180&#39;}&quot;)
print(f&quot;4. {&#39;為你自己學 Rust&#39;:&lt;20} {&#39;NTD 250&#39;}&quot;)
```

印出來的結果會變這樣：

```
1. 為你自己學 Python         NTD 120
2. 為你自己學 Git            NTD 200
3. 為你自己學 Ruby           NTD 180
4. 為你自己學 Rust           NTD 250
```

填補的字串預設是使用空白字元，但如果你喜歡也可以換成別的字，例如：

```py
pi = 3.1415926

print(f&quot;|{pi:x&lt;20}|&quot;)  # 靠左對齊
print(f&quot;|{pi:x&gt;20}|&quot;)  # 靠右對齊
print(f&quot;|{pi:x^20}|&quot;)  # 置中對
```

我用了 `x` 字元來填補空白，印出來的結果會變成：

```
|3.1415926xxxxxxxxxxx|
|xxxxxxxxxxx3.1415926|
|xxxxx3.1415926xxxxxx|
```

F 字串也能幫我們把整數轉換成二進位、八進位或十六進位，例如：

```py
# 格式化成二進位
print(f&quot;{10:b}&quot;) # 印出 1010

 # 格式化成八進位
print(f&quot;{10:o}&quot;) # 印出 12

# 格式化成十六進位
print(f&quot;{255:x}&quot;) # 印出 ff
```

還記得以前學過的「科學記號表示」嗎？F 字串也能幫我們搞定，例如：

```py
speed_of_light = 299792458      # 光速
print(f&quot;{speed_of_light:.3e}&quot;)  # 印出 2.998e+08
```

`.3` 代表小數點後面要顯示幾位數，`e` 代表科學記號，這樣就能把數字格式化成科學記號表示法。最後，F 字串還能順便幫我們搞定日期格式：

```py
from datetime import date

the_day = date(1947, 2, 28)   # 228

print(f&quot;{the_day:%Y/%m/%d}&quot;)  # 印出 1947/02/28
```

其中 `%Y` 跟 `%m` 跟 `%d` 是分別代表代表年份、代表月份以及日期，這些格式化參數的用法跟其它程式語言的格式化差不多，應該不難查到分別代表哪些意思。雖然在其它程式語言也有類似這種把變數塞進字串裡的「字串安插（String Interpolation）」功能，但 Python 的 F 字串還能加上格式化工具，能玩的把戲就更多了

