Python 的字串格式化讓你能優雅地將變數嵌入字串,而不必靠繁瑣的型別轉換與串接。本文涵蓋現代主流方式 f-string(格式化字串字面值)與傳統 .format() 方法的完整語法,包含對齊、填充、浮點數精度控制、條件表達式嵌入,以及量化策略開發中最實用的數字格式技巧。
什麼是字串格式化?
字串格式化就像填空卷:先寫好模板,再把變數填入預留的空格,讓輸出結果更具可讀性。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 的花括號內盡量保持簡潔,複雜的條件邏輯請先計算好再嵌入,讓程式碼的可讀性更高、除錯也更容易。
Tags
python