Python f-string 與 format:字串格式化完整教學

Python 的字串格式化讓你能優雅地將變數嵌入字串,而不必靠繁瑣的型別轉換與串接。本文涵蓋現代主流方式 f-string(格式化字串字面值)與傳統 .format() 方法的完整語法,包含對齊、填充、浮點數精度控制、條件表達式嵌入,以及量化策略開發中最實用的數字格式技巧。

Glowing golden text variables flowing into a luminous string template, surrounded by floating code fragments and curly brace symbols in deep space, cinematic lighting, amber and cyan tones, deep shadows, 16:9, abstract programming visualization

什麼是字串格式化?

字串格式化就像填空卷:先寫好模板,再把變數填入預留的空格,讓輸出結果更具可讀性。Python 提供三種方式:舊版 % 佔位符(不推薦)、Python 2.6 起的 .format() 方法,以及 Python 3.6 起的 f-string(Formatted String Literals)。f-string 語法最簡潔直觀,是目前業界主流;.format() 的命名參數與重複使用特性,在部分場景仍有優勢。

核心語法

# ── 範例 1:f-string 基礎 ──
# 語法:在字串引號前加上 f,花括號內直接寫變數名稱

name = "Alex"
score = 95
height = 1.75

print(f"姓名:{name}")                   # 姓名:Alex
print(f"分數:{score}")                   # 分數:95
print(f"身高:{height} 公尺")             # 身高:1.75 公尺

# 多個變數
print(f"{name} 的分數是 {score} 分")      # Alex 的分數是 95 分

# f-string 內可以直接寫運算式
a, b = 10, 3
print(f"{a} 除以 {b} = {a / b:.2f}")     # 10 除以 3 = 3.33
print(f"2 的 10 次方 = {2 ** 10}")        # 2 的 10 次方 = 1024
# ── 範例 2:.format() 方法 ──
# 語法:字串中用 {} 佔位,再於 .format() 中傳入值

# 按順序插入
print("姓名:{},分數:{}".format("Alex", 95))
# → 姓名:Alex,分數:95

# 按索引插入(可重複使用)
print("The {2} {1} {0}".format("fox", "brown", "quick"))
# → The quick brown fox

# 命名參數(最推薦,可讀性最高)
template = "你好,{name}!你的餘額是 ${balance:.2f}"
print(template.format(name="Alex", balance=1234.5))
# → 你好,Alex!你的餘額是 $1234.50

# 命名參數可重複使用
print("{unit} 買進 3 張,{unit} 賣出 2 張".format(unit="TSMC"))
# → TSMC 買進 3 張,TSMC 賣出 2 張

f-string 中的花括號 {} 內可以放任何 Python 運算式,包括函數呼叫、條件式、方法呼叫,例如 f"{name.upper()}"f"{'通過' if score >= 60 else '不通過'}"。這讓 f-string 遠比 .format() 更靈活,但要注意不要塞入過多邏輯,以免降低可讀性。

規則與注意事項

規則 ✅ 正確範例 ❌ 錯誤範例 / 陷阱
f-string 中的引號不可與外層衝突 f"名字:{'Alex'}" 或改用外層單引號 f"名字:{"Alex"}"(SyntaxError!)
花括號需成對,要輸出字面 {} 須寫兩個 f"空集合:{{}}" → 輸出 {} f"空集合:{}"(SyntaxError!)
.format() 的索引數量須與引數數量對應 "{0} {1}".format("a","b") "{0} {2}".format("a","b")(IndexError!)
f-string 僅支援 Python 3.6+ Python 3.6 以上版本直接使用 Python 3.5 或更早版本會 SyntaxError
格式化不改變原始變數的值 f"{price:.2f}" 只影響輸出顯示 誤以為 price 本身被四捨五入

常見錯誤與防呆

錯誤一:f-string 內外引號衝突

# ❌ 錯誤寫法(SyntaxError: f-string: unmatched '(')
msg = f"他說:"你好""   # 引號層疊導致解析錯誤

# ✅ 正確寫法一:內外引號不同種
msg = f'他說:"你好"'
print(msg)  # 他說:"你好"

# ✅ 正確寫法二:先存變數再嵌入
greeting = '"你好"'
msg = f"他說:{greeting}"
print(msg)  # 他說:"你好"

錯誤二:忘記輸出字面花括號要雙寫

# ❌ 錯誤寫法(SyntaxError: single '}' is not allowed)
print(f"Python 字典語法:{key: value}")  # 解析混亂

# ✅ 正確寫法:字面 { 和 } 各用兩個
print(f"Python 字典語法:{{key: value}}")
# → Python 字典語法:{key: value}

錯誤三:混淆「格式化顯示」與「修改變數」

# ❌ 常見誤解:以為格式化後 price 的值改變了
price = 3.14159
output = f"{price:.2f}"
print(price)   # 3.14159(原始值不變!)
print(output)  # 3.14(只是顯示四捨五入)

# ✅ 若真的需要改變值,請用 round()
price = round(price, 2)
print(price)   # 3.14

進階用法

數字格式化:對齊、填充、精度控制

# 格式語法:{變數:[[填充字元]對齊方式][寬度][.精度][型態]}
# 對齊符號:< 靠左、> 靠右、^ 置中

price = 1234567.89

# 浮點數精度
print(f"{price:.2f}")          # 1234567.89(保留 2 位小數)
print(f"{price:.4f}")          # 1234567.8900

# 千位分隔符
print(f"{price:,.2f}")         # 1,234,567.89

# 寬度與對齊(常用於製作對齊報表)
for item, val in [("買進", 105.5), ("賣出", 98.3), ("獲利", 7.2)]:
    print(f"{item:<4} | {val:>8.2f}")
# 買進     |   105.50
# 賣出     |    98.30
# 獲利     |     7.20

# 整數的補零(適合時間格式化)
h, m, s = 9, 5, 3
print(f"{h:02d}:{m:02d}:{s:02d}")  # 09:05:03

f-string 嵌入條件與函數呼叫

# f-string 花括號內可以放運算式(但建議保持簡短)
score = 72
level = "pass" if score >= 60 else "fail"

# ✅ 建議:條件式先算好再嵌入,易讀性更高
print(f"測試結果:{level}")

# 函數呼叫:嵌入 len()、upper()、round() 等
text = "python"
print(f"字元數:{len(text)},大寫:{text.upper()}")
# → 字元數:6,大寫:PYTHON

# 量化策略場景:輸出交易摘要
symbol  = "EURUSD"
entry   = 1.08523
exit_p  = 1.09105
pips    = (exit_p - entry) * 10000

print(f"交易品種:{symbol}")
print(f"進場價:{entry:.5f}  出場價:{exit_p:.5f}")
print(f"獲利點數:{pips:+.1f} pips")   # +:強制顯示正負號

.format() 進階:模板重複使用

# .format() 的命名參數適合建立可重複使用的訊息模板
report_template = (
    "=== {title} ===\n"
    "日期:{date}\n"
    "獲利:{profit:+.2f} USD\n"
    "勝率:{winrate:.1%}\n"
)

# 只需改變引數即可套用不同資料
print(report_template.format(
    title="每日回測報告",
    date="2026-03-26",
    profit=352.50,
    winrate=0.623
))
# === 每日回測報告 ===
# 日期:2026-03-26
# 獲利:+352.50 USD
# 勝率:62.3%

🏮 煉金師小叮嚀

在量化交易策略開發中,我幾乎每天都在用 f-string 格式化回測報告和交易日誌。特別推薦掌握 :+.2f(強制顯示正負號):,.0f(千位分隔整數)這兩個格式符,輸出損益數字時既直觀又專業。另外提醒:f-string 的花括號內盡量保持簡潔,複雜的條件邏輯請先計算好再嵌入,讓程式碼的可讀性更高、除錯也更容易。

張貼留言

較新的 較舊